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 に追加しましたが、問題ありませんが、ボタンのアイコン プロパティを設定しようとすると、エラーが発生します。

プロパティ「アイコン」への値の書き込みに失敗しました

でこのメソッドへの呼び出しを削除するとプロパティを設定できるため、問題はimgToBufferedImgsetIconから発生しているようです。画像変換方法の何が問題になっていますか?

編集:

次のテストは成功しました:

try {
    imgToBufferedImg(ImageIO.read(new FileInputStream("test.png")));
} catch (IOException ex) {
    Exceptions.printStackTrace(ex);
}

また、問題の原因は次のとおりであることがわかりました。

((ImageIcon) icon).getImage();

UI の準備ができたら (たとえば、 a を使用してSwingUtilities.invokeLater) このコードを実行するとうまくいくようです。

4

3 に答える 3

3

問題はにある可能性がありますToolkit#createImage()ImageIO.read()良いかもしれません。また、からの結果を破棄しているように見えますimgToBufferedImg()

于 2012-10-08T13:02:24.827 に答える
2

理由はない

  • BufferedImage内部に作成しJButtons setIcon()、そこに設定する必要があります (for JButton) Icon,ImageIcon

  • これBufferedImage( のはずですIcon)ImageIconは、 が追加された後に作成されますJButton


しかし

于 2012-10-08T08:44:52.730 に答える
1

スラッシングされたコメントのおかげで:

Toolkit "操作は非同期で実行される可能性があります。" レンダリングしようとすると、画像が不完全になる場合があります。

何が問題なのかを理解することができました。メソッドから直接setIcon、アイコンから画像をリクエストしました:

((ImageIcon) icon).getImage()

しかし、このイメージは決定的に不完全です。イベントディスパッチスレッド内で私のロジックをプーチンすると、うまくいきました。

SwingUtilities.invokeLater(new Runnable() {

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