Java:无法重新绘制ImageIcon

时间:2015-04-24 15:46:29

标签: java swing jbutton imageicon

我有一个JFrameJFrame里面是JPanelJPanel里面是JButton。我为每个按钮设置了ImageIcon

然后,我需要给JButton一个新的ImageIcon。我试过这个:

buttons[0].setIcon(new ImageIcon("path/to/new/icon"));

但它没有用。还尝试过:

buttons[0].revalidate();
my_jpanel.revalidate();

那我忘记了什么?为什么它没有重新粉刷?

1 个答案:

答案 0 :(得分:2)

您应该确保加载您认为正在加载的文件。试试这个:

ImageIcon icon = new ImageIcon("path/to/new/icon");
System.out.println(icon.getDescription());

如果文件未正确加载,则为null。如果这是您的问题,请尝试在Windows上使用绝对路径(例如Linux上的/home/waTEXmelon/program/blah.jpgC:\\Users\\waTEXmelon\\program\\blah.jpg)。

如果您希望图标位于类路径中,请使用:

new ImageIcon(getClass().getResource("/class/path/to/icon"));

您还应该考虑checking out ImageIO以帮助在将来防止此问题,它比基本构造函数更强大。

如果以上您的问题,请考虑Swing is not Thread Safe,您可能正在修改事件调度线程以外的线程上的图标。试着这样做:

EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        buttons[0].setIcon(new ImageIcon("path/to/new/icon"));
    }
}

如果仍然无法解决您的问题,那么问题可能是@camrickr建议的问题,例如:您添加图标的JButton不是您认为要添加的图标。要对此进行测试,请在创建按钮和更新图标时执行以下操作:

System.out.println(System.identityHashCode(button[0]));

如果不匹配,则按钮不是同一个按钮。