<< 2007/06/03 | Home | 2007/06/05 >>
PR: 転職    転職    合宿免許    漫画    シルバー    ブライダルエステ    墓地・霊園    葬式   

思い込み

選択状態のオブジェクトを赤く表示するため、以前、色々と試したことがある。

元のオブジェクトをモノクロで透過GIFで作っておいて、選択状態(赤)は、それを元にRGBImageFilterを使って変換すればできるはず、と思ったのだけど、散々試してダメだったので、あきらめて赤いオブジェクトを別のgifで用意していた。

で、今日、ちょっと試してみたら、あっさりできた。何が悪かったかと言うと、以前はJLabelを継承してpaintComponentをオーバーライドしてdrawImage()して実験していたんだけど、これだとなぜかRGBImageFilterを使った時だけちゃんと表示されないんだよね(原因不明)。で、ふとJPanelに変えてみたら、あっさりとうまくいった。ずっとRGBImageFilterの使い方の方が悪いと思い込んでいた。こういう思い込みって、歳をとってから大分減った気がするんだけど、なくならないなぁ。

思い込みが払拭された瞬間は格別だ。

public class Test extends JPanel {
    Image img;

    public Test() {
        try {
            img = ImageIO.read(new File("test.gif"));
        }
        catch (IOException ex) {
	    ex.printStackTrace();
        }
        SelectedImageFilter sif = new SelectedImageFilter();
        img= createImage(new FilteredImageSource(img.getSource(), sif));
    }

    @Override protected void paintComponent(Graphics g) {
	g.drawImage(img, 0, 0, this);
    }

    public static void main(String[] args) {
	JFrame frm = new JFrame();
	frm.setLayout(null);
	Test test = new Test();
	test.setSize(50, 50);
	frm.getContentPane().add(test);
	frm.setBounds(0, 0, 100, 100);
	frm.setVisible(true);
    }

    private static class SelectedImageFilter extends RGBImageFilter {
        public SelectedImageFilter() {
            canFilterIndexColorModel = true;
        }

        @Override public int filterRGB(int x, int y, int argb) {
	    return (argb | 0x0000FF00);
        }
    }
}

このコード、最初を

public class Test extends JLabel {

とすると、何も表示されなくなる。でも、そのままRGBImageFilterによる変換もやめると、変換前のビットマップならば、ちゃんと表示される。

//        img= createImage(new FilteredImageSource(img.getSource(), sif));
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8