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,您将在此处设置(对于JButtonIconImageIcon

这个BufferedImage(应该是IconImageIcon)是在添加到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,自定义按钮图标属性错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中将图标放在自定义按钮内

easyui 怎么弄有自定义图标的按钮

easyui 导航菜单如何使用自定义图标

使用按钮名称和图标反应引导按钮自定义

创建自定义导航栏渲染器以在 xamarin 表单 IOS 项目中添加自定义后退按钮图标

Maya 2015-自定义货架按钮缺少图标