我有一个JFrame
,JFrame
里面是JPanel
,JPanel
里面是JButton
。我为每个按钮设置了ImageIcon
。
然后,我需要给JButton
一个新的ImageIcon
。我试过这个:
buttons[0].setIcon(new ImageIcon("path/to/new/icon"));
但它没有用。还尝试过:
buttons[0].revalidate();
my_jpanel.revalidate();
那我忘记了什么?为什么它没有重新粉刷?
答案 0 :(得分:2)
您应该确保加载您认为正在加载的文件。试试这个:
ImageIcon icon = new ImageIcon("path/to/new/icon");
System.out.println(icon.getDescription());
如果文件未正确加载,则为null
。如果这是您的问题,请尝试在Windows上使用绝对路径(例如Linux上的/home/waTEXmelon/program/blah.jpg
或C:\\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]));
如果不匹配,则按钮不是同一个按钮。