Java: 无法重新绘制 ImageIcon

Java: Can't repaint ImageIcon

我有一个JFrameJFrame里面有一个JPanelJPanel里面有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.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]));

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