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

元のオブジェクトをモノクロで透過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));





