Java: 无法重新绘制 ImageIcon
Java: Can't repaint ImageIcon
我有一个JFrame
,JFrame
里面有一个JPanel
,JPanel
里面有12个JButton
。我为每个按钮设置了一个 ImageIcon
。
然后,我需要给一个JButton
一个新的ImageIcon
。我试过这个:
buttons[0].setIcon(new ImageIcon("path/to/new/icon"));
但是没有用。也试过:
buttons[0].revalidate();
my_jpanel.revalidate();
所以我忘记了什么?为什么它不重绘?
您应该确保正在加载您认为正在加载的文件。试试这个:
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]));
如果这不匹配,则按钮不是同一个按钮。
我有一个JFrame
,JFrame
里面有一个JPanel
,JPanel
里面有12个JButton
。我为每个按钮设置了一个 ImageIcon
。
然后,我需要给一个JButton
一个新的ImageIcon
。我试过这个:
buttons[0].setIcon(new ImageIcon("path/to/new/icon"));
但是没有用。也试过:
buttons[0].revalidate();
my_jpanel.revalidate();
所以我忘记了什么?为什么它不重绘?
您应该确保正在加载您认为正在加载的文件。试试这个:
ImageIcon icon = new ImageIcon("path/to/new/icon");
System.out.println(icon.getDescription());
如果文件未正确加载,这将是 null
。如果这是您的问题,请尝试在 Windows.
/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]));
如果这不匹配,则按钮不是同一个按钮。