Netbeans matisse,自定义按钮图标属性错误
Posted
技术标签:
【中文标题】Netbeans matisse,自定义按钮图标属性错误【英文标题】:Netbeans matisse, custom button icon property error 【发布时间】:2012-09-28 11:29:45 【问题描述】:我创建了一个自定义 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
)似乎可行。
【问题讨论】:
【参考方案1】:问题可能出在Toolkit#createImage()
。 ImageIO.read()
可能会更好。此外,您似乎正在丢弃来自imgToBufferedImg()
的结果。
【讨论】:
看起来不像,我把结果扔掉了。我尝试使这个测试用例尽可能简单,以表明调用我的方法的唯一事实会引发问题。在我的实际项目中,我的想法当然不同,您在我的问题中看到的代码是代码重构目标问题的结果。我认为问题不是来自 Toolkit,因为它应该从路径中以字符串形式返回图像。 @nathan:Toolkit
"操作可能异步执行。"当您尝试渲染它时,您的 Image
可能不完整。 ImageIO.read()
值得一试。【参考方案2】:
没有理由
在JButtons setIcon()
中创建BufferedImage
,您将在此处设置(对于JButton
)Icon
,ImageIcon
这个BufferedImage
(应该是Icon
,ImageIcon
)是在添加到JButton
之后创建的
但是
方法可以是BufferedImage to Icon, ImageIcon
JButton#setIcon()
有什么问题
you can use paintComponent() too
【讨论】:
不明白。实际上我展示的代码是一个测试用例,我需要加载有关图标集的图像。所以每次设置新图标时我都需要调用此代码。实际上,我填充了一个包含后期效果图标的 ImageIcon 数组。post-effected icons
in JButtons API
是直接用于setXxxIcon
或使用ButtonModel 的fwe 方法,也许有任何理由覆盖JButton
...
:-) matisse 调用一种方法。设置图标。我想用这个方法调用我的逻辑。我知道这些方法并且我使用它们但是在 setIcon 中执行逻辑之后。我的问题是为什么我的方法 imgToBufferedImg 会导致上述错误。【参考方案3】:
感谢评论:
工具包“操作可以异步执行。”当您尝试渲染时,您的图像可能不完整。
我能够找出问题所在。直接从setIcon
方法,我从图标请求图像:
((ImageIcon) icon).getImage()
但是这张图片绝对是不完整的。普京我在事件调度线程中的逻辑成功了。
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
//requesting icon images here
【讨论】:
总是一个好主意。还有更多想法here。以上是关于Netbeans matisse,自定义按钮图标属性错误的主要内容,如果未能解决你的问题,请参考以下文章