【发布时间】: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 设置为某个空值?