java - 包含 ImageIcon 的 JLabel 不会重新绘制

标签 java swing imageicon

我正在编写一个应用程序,该应用程序以随机​​顺序创建一副纸牌,当按下按钮时,会将顶部的纸牌移动到底部并显示新的顶部的纸牌。 (对于那些熟悉《万智牌》的人来说,这是为了模拟 Planechase 牌组。)按下按钮时,它会正确循环浏览图像文件,但是当我使用 ImageIcon 将图像分配给 JLabel 时,我无法获取 JLabel刷新新图像。这是我用来刷新的代码

    nextCardButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            planechase.topCardIncrement();
            createCardToDisplay();
        }
    });

planechase 是 CardDeck 类的一个实例,它存储随机牌组,并具有多种洗牌、更换牌等方法。topCardIncrement() 将顶部牌更改为列表中的下一张牌。

    private void createCardToDisplay()
    {
    cardToDisplay = new JLabel(new ImageIcon(planechase.getFolderName() + "\\" + planechase.displayTopCard()));
    }

createCardToDisplay 将 cardToDisplay 分配给从图像的文件夹名称和当前文件派生的图像。 cardToDisplay 放置在 JPanel contentPanel 内,而 contentPanel 放置在 JFrame 框架内。我无法找出重新绘制/重新验证(我不太清楚有什么区别)我的 GUI 来反射(reflect)更新后的图像的正确方法。我已经通过 System.out.println 调用确认了

    planechase.getFolderName() + "\\" + planechase.displayTopCard()

正在按预期更新,因此我假设 JLabel 已正确重新分配。重新绘制它以反射(reflect)新的 ImageIcon 的正确方法是什么?

最佳答案

代码不明确...

我首先想到的是......

private void createCardToDisplay()
{
    cardToDisplay = new JLabel(new ImageIcon(planechase.getFolderName() + "\\" + planechase.displayTopCard()));
}

这正在创建 cardToDisplay 的新实例,但它是否已添加到任何地方?之前的实例是否已被删除?没有上下文可以确定。

通常,当您想要更改 JLabel 的图标时,只需在 JLabel 实例上调用 setIcon 即可。 .

cardToDisplay.setIcon(new ImageIcon(planechase.getFolderName() + "\\" + planechase.displayTopCard()));

由于这是一个绑定(bind)字段,因此会自动触发重绘请求。

关于java - 包含 ImageIcon 的 JLabel 不会重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25153391/

相关文章:

Java 集合没有 Map 作为集合框架的一部分

java - 不能画线(方法: paintComponent) - Java

Java 将图像从文件读取到 ArrayList 并显示到 JPanel 上

返回 Null 指针的 png 上的 Java getClass().getResource

java - 如何从单个方法返回不同的数据类型?

java - 为什么 JVM 不是 "seeing"字符串池内存中的重复字符串值?

java - Spring Integration AMQP - 消息偶尔未确认,需要超时吗?

java - 当我按下 GUI 上的按钮时,如何存储按钮的值?

java - 在 DefaultTableModel 中插入单选按钮

Java 路径 ImageIcon URL .JAR