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

时间:2012-10-08 08:29:50

标签: java swing netbeans matisse

我创建了一个自定义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)运行此代码似乎有效。

3 个答案:

答案 0 :(得分:3)

问题可能出在Toolkit#createImage()ImageIO.read()可能会更好。此外,您似乎丢弃了imgToBufferedImg()的结果。

答案 1 :(得分:2)

没理由

  • BufferedImage内创建JButtons setIcon(),您可以设置(JButtonIconImageIcon

  • BufferedImage(应为IconImageIcon)在添加到JButton后创建


答案 2 :(得分:1)

感谢受到抨击的评论:

Toolkit“操作可以异步执行。”尝试渲染时,您的图像可能不完整。

我能够弄清楚问题是什么。直接从setIcon方法,我从图标请求图像:

((ImageIcon) icon).getImage()

但这张图片肯定是不完整的。把我的逻辑放在事件调度线程中就可以了。

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        //requesting icon images here
    }
}