我正在编写一个应用程序,该应用程序以随机顺序创建一副纸牌,当按下按钮时,会将顶部的纸牌移动到底部并显示新的顶部的纸牌。 (对于那些熟悉《万智牌》的人来说,这是为了模拟 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/