【问题标题】:JLabel containing an ImageIcon won't repaint包含 ImageIcon 的 JLabel 不会重新绘制
【发布时间】:2014-09-28 23:25:02
【问题描述】:

我正在编写一个应用程序,它以随机顺序创建一副纸牌,当按下按钮时,将最上面的卡片移动到底部并显示新的最上面的卡片。 (这是为那些熟悉万智牌的人模拟 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 中,该内容放置在 JFrame 框架中。我无法弄清楚重新绘制/重新验证的正确方法(我不太清楚有什么区别)我的 GUI 以反映更新的图像。我已经通过 System.out.println 调用确认了

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

正在按应有的方式进行更新,因此我假设 JLabel 已正确重新分配。重绘它以反映新的 ImageIcon 的正确方法是什么?

【问题讨论】:

  • 图像相对于类存储在哪里?您是否尝试过使用ImageIO.read 加载图像,当出现问题时会抛出IOException...
  • 你试过在 JLabel 的容器上调用 repaint() 吗?
  • 在您的代码示例中,您正在创建cardToDisplay 的新实例,但没有添加任何内容...这可能是您的问题的原因,但没有上下文可以确定。考虑提供一个runnable example 来证明您的问题。这将导致更少的混乱和更好的响应
  • “重绘它以反映新的 ImageIcon 的正确方法是什么?” cardToDisplay.setIcon(new ImageIcon(planechase.getFolderName() + "\\" + planechase.displayTopCard())); ...但根据我之前的评论,没有上下文确保在您的情况下这是正确的做法......
  • 疯了,图像存储在 MagicMultiplayerApplication\planes\"...".jpg 相对于 MagicMultiplayerApplication\src\"...".java 第一个图像显示自己,以及后续图像的路径是正确的,这只是正确重新绘制 JPanel 的问题。还有 Jaco,我尝试重新粉刷 JLabel 的容器。如果我再次调用 createCardToDisplay,标签会更新吗?还是我必须将以前的 cardToDisplay 设置为某个空值?

标签: java swing imageicon


【解决方案1】:

代码有歧义...

首先让我跳出来的是……

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

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

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

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

因为这是一个绑定字段,所以会自动触发重绘请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2012-09-07
    相关资源
    最近更新 更多