【问题标题】:Netbeans matisse, custom button icon property errorNetbeans matisse,自定义按钮图标属性错误
【发布时间】: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)似乎可行。

【问题讨论】:

    标签: java swing netbeans matisse


    【解决方案1】:

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

    【讨论】:

    • 看起来不像,我把结果扔掉了。我尝试使这个测试用例尽可能简单,以表明调用我的方法的唯一事实会引发问题。在我的实际项目中,我的想法当然不同,您在我的问题中看到的代码是代码重构目标问题的结果。我认为问题不是来自 Toolkit,因为它应该从路径中以字符串形式返回图像。
    • @nathan: Toolkit "操作可能异步执行。"当您尝试渲染它时,您的 Image 可能不完整。 ImageIO.read() 值得一试。
    【解决方案2】:

    没有理由

    • JButtons setIcon() 中创建BufferedImage,您将在此处设置(对于JButtonIconImageIcon

    • 这个BufferedImage(应该是IconImageIcon)是在添加到JButton之后创建的


    但是

    【讨论】:

    • 不明白。实际上我展示的代码是一个测试用例,我需要加载有关图标集的图像。所以每次设置新图标时我都需要调用此代码。实际上,我填充了一个包含后期效果图标的 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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多