JFrame.setGlassPane(Component)
複数回呼び出すコツはありますか?以下のコードでは、最初にそれを呼び出して、ガラスペインに赤いボックスを作成します。それはうまくいきます。次に、マウスクリックハンドラーでもう一度呼び出して、新しいガラスペインに青いボックスを作成します。これは機能しません。元の赤いガラス板は消えますが、青いガラス板は表示されません。私はここで何が間違っているのですか?
public class GlassPaneProblem extends Component {
private BufferedImage img;
private JFrame f;
public void paint(Graphics g) {
g.drawImage(img, 0, 0, null);
}
public GlassPaneProblem() {
try {
img = ImageIO.read(new File("images/AppleCorps.JPG"));
} catch (IOException e) {
}
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
BlueGlassPane blueGlassPane = new BlueGlassPane();
setTheGlassPane(blueGlassPane);
}
});
}
public Dimension getPreferredSize() {
if (img == null) {
return new Dimension(100, 100);
} else {
return new Dimension(img.getWidth(null), img.getHeight(null));
}
}
public void run() {
f = new JFrame("Glass Pane Problem");
f.add(this);
f.pack();
RedGlassPane redGlassPane = new RedGlassPane();
setTheGlassPane(redGlassPane);
f.setVisible(true);
}
void setTheGlassPane(JComponent glassPane) {
f.setGlassPane(glassPane);
f.getGlassPane().setVisible(true);
}
public static void main(String[] args) {
GlassPaneProblem glassPaneProblem = new GlassPaneProblem();
glassPaneProblem.run();
}
}
class RedGlassPane extends JComponent {
protected void paintComponent(Graphics g) {
Rectangle clip = g.getClipBounds();
g.setColor(Color.RED);
g.fillRect(clip.x + clip.width / 3, clip.y + clip.height / 3,
clip.width / 3, clip.height / 3);
}
}
class BlueGlassPane extends JComponent {
protected void paintComponent(Graphics g) {
Rectangle clip = g.getClipBounds();
g.setColor(Color.BLUE);
g.fillRect(clip.x + clip.width / 3, clip.y + clip.height / 3,
clip.width / 3, clip.height / 3);
}
}
このように呼び出しrepaint()
ても問題は解決しません。
void setTheGlassPane(JComponent glassPane) {
f.setGlassPane(glassPane);
f.getGlassPane().setVisible(true);
f.repaint();
}