我已经创建了一个定制的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中添加了这个组件,但是,当我试图设置按钮的图标属性时,会得到错误:
未能将值写入属性“图标”
问题似乎来自于imgToBufferedImg,因为如果在setIcon中删除对此方法的调用,则可以设置属性。我的图像转换方法有什么问题?
编辑:
下列测试成功:
try {
imgToBufferedImg(ImageIO.read(new FileInputStream("test.png")));
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}此外,我刚刚发现问题是由以下原因引起的:
((ImageIcon) icon).getImage();当UI准备好时运行这段代码(例如使用SwingUtilities.invokeLater)似乎是可行的。
发布于 2012-10-08 13:02:24
问题可能在Toolkit#createImage()中。ImageIO.read()可能会更好。而且,看起来您正在丢弃imgToBufferedImg()的结果。
发布于 2012-10-08 08:44:52
没有理由
JButtons setIcon()中创建JButtons setIcon(),您将设置( JButton) Icon、ImageIconBufferedImage (应该是Icon,ImageIcon)是在添加到JButton之后创建的但
BufferedImage to Icon, ImageIconJButton#setIcon()有什么问题?发布于 2012-10-10 08:23:28
多亏了这番令人震惊的评论:
“工具包”操作可以异步执行。您的图像可能是不完整的,当您试图渲染它。
我能弄清楚问题出在哪里。我直接从setIcon方法请求图标中的图像:
((ImageIcon) icon).getImage()但这幅图像绝对不完整。普京在事件调度线程中的逻辑做到了这一点。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//requesting icon images here
}
}https://stackoverflow.com/questions/12777917
复制相似问题