我创建了一个自定义JButton
,覆盖了setIcon
。
public class TestButton extends JButton {
public TestButton() {
super();
}
@Override
public void setIcon(Icon icon) {
super.setIcon(icon);
imgToBufferedImg(Toolkit.getDefaultToolkit().createImage("test.png"));
}
}
这是 imgToBufferedImg 方法。
public BufferedImage imgToBufferedImg(Image image) {
if (image == null) {
return null;
}
if (image instanceof BufferedImage) {
return ((BufferedImage) image);
} else {
BufferedImage bufferedImage = new BufferedImage(
image.getWidth(null),
image.getHeight(null),
BufferedImage.TYPE_INT_ARGB);
Graphics g = bufferedImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return bufferedImage;
}
}
我在Matisse中添加了这个组件,没问题,但是,当我尝试设置按钮的图标属性时,我得到了错误:
无法将值写入属性“icon”
问题似乎来自 imgToBufferedImg ,因为我可以设置属性,如果我在setIcon
中删除对此方法的调用。我的图像转换方法有什么问题?
编辑:
以下测试成功:
try {
imgToBufferedImg(ImageIO.read(new FileInputStream("test.png")));
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
此外,我只是发现问题是由以下原因引起的:
((ImageIcon) icon).getImage();
当UI准备好时(例如使用SwingUtilities.invokeLater
)运行此代码似乎有效。
答案 0 :(得分:3)
问题可能出在Toolkit#createImage()
。 ImageIO.read()
可能会更好。此外,您似乎丢弃了imgToBufferedImg()
的结果。
答案 1 :(得分:2)
没理由
在BufferedImage
内创建JButtons setIcon()
,您可以设置(JButton
)Icon
,ImageIcon
此BufferedImage
(应为Icon
,ImageIcon
)在添加到JButton
后创建
但
方法可以是BufferedImage to Icon, ImageIcon
JButton#setIcon()
答案 2 :(得分:1)
感谢受到抨击的评论:
Toolkit“操作可以异步执行。”尝试渲染时,您的图像可能不完整。
我能够弄清楚问题是什么。直接从setIcon
方法,我从图标请求图像:
((ImageIcon) icon).getImage()
但这张图片肯定是不完整的。把我的逻辑放在事件调度线程中就可以了。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//requesting icon images here
}
}