2

我创建了一个自定义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)似乎可以工作。

4

3 回答 3

3

问题可能出在Toolkit#createImage(). ImageIO.read()可能会更好。此外,看起来您正在丢弃imgToBufferedImg().

于 2012-10-08T13:02:24.827 回答
2

没有理由

  • BufferedImage在里面创建JButtons setIcon(),你会在那里设置(for JButtonIconImageIcon

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


于 2012-10-08T08:44:52.730 回答
1

感谢被抨击的评论:

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

我能够弄清楚问题所在。直接从setIcon方法中,我从图标请求图像:

((ImageIcon) icon).getImage()

但这张图绝对是不完整的。普京我在事件调度线程中的逻辑成功了。

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        //requesting icon images here
    }
}
于 2012-10-10T08:23:28.093 回答