首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netbeans matisse,自定义按钮图标属性错误

Netbeans matisse,自定义按钮图标属性错误
EN

Stack Overflow用户
提问于 2012-10-08 08:29:49
回答 3查看 686关注 0票数 2

我已经创建了一个定制的JButton,其中覆盖了setIcon

代码语言:javascript
复制
public class TestButton extends JButton {

    public TestButton() {
        super();
    }

    @Override
    public void setIcon(Icon icon) {
        super.setIcon(icon);
        imgToBufferedImg(Toolkit.getDefaultToolkit().createImage("test.png"));
    }
}

这是imgToBufferedImg方法。

代码语言:javascript
复制
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中删除对此方法的调用,则可以设置属性。我的图像转换方法有什么问题?

编辑:

下列测试成功:

代码语言:javascript
复制
try {
    imgToBufferedImg(ImageIO.read(new FileInputStream("test.png")));
} catch (IOException ex) {
    Exceptions.printStackTrace(ex);
}

此外,我刚刚发现问题是由以下原因引起的:

代码语言:javascript
复制
((ImageIcon) icon).getImage();

当UI准备好时运行这段代码(例如使用SwingUtilities.invokeLater)似乎是可行的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-08 13:02:24

问题可能在Toolkit#createImage()中。ImageIO.read()可能会更好。而且,看起来您正在丢弃imgToBufferedImg()的结果。

票数 3
EN

Stack Overflow用户

发布于 2012-10-08 08:44:52

没有理由

  • JButtons setIcon()中创建JButtons setIcon(),您将设置( JButton) IconImageIcon
  • 这个BufferedImage (应该是IconImageIcon)是在添加到JButton之后创建的

票数 2
EN

Stack Overflow用户

发布于 2012-10-10 08:23:28

多亏了这番令人震惊的评论:

“工具包”操作可以异步执行。您的图像可能是不完整的,当您试图渲染它。

我能弄清楚问题出在哪里。我直接从setIcon方法请求图标中的图像:

代码语言:javascript
复制
((ImageIcon) icon).getImage()

但这幅图像绝对不完整。普京在事件调度线程中的逻辑做到了这一点。

代码语言:javascript
复制
SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        //requesting icon images here
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12777917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档