Java:无法重新绘制 ImageIcon

标签 java swing jbutton 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。如果这是您的问题,请尝试使用绝对路径(例如 Linux 上的 /home/waTEXmelon/program/blah.jpgC:\\Users\\waTEXmelon\\program\\blah .jpg) 在 Windows 上。

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

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 不是您认为要添加图标的 JButton。要对此进行测试,请在创建按钮和更新图标时执行以下操作:

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

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

关于Java:无法重新绘制 ImageIcon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29851928/

相关文章:

java - 将 ClientFilter 从 Jersey 移动到 Jersey 2

java - 我不知道 "i[1]=data[1]& 0xff;"的意思

java - 使用 jax-rs 从 REST 服务下载 xml 而无需本地存储文件

java - 为什么这个 Swing 应用程序挂起?

java - JButton 的操作调用了 focusLost 事件。这怎么可能?

java - 如何将带有泛型的 java 构建器编写为 scala?

java - 在 Netbeans 7.2 中添加 SwingX 调色板

java - 有没有一种方法可以在 JOptionPane 内的一条语句中将字符串转换为 double 或 int ?

java - JTable:单元格中自定义面板中的按钮

java - 向 JFrame 添加事件监听器