電子書籍の厳選無料作品が豊富!

つい先日も質問させていただきましたが、また分からないことがでてきたのでお聞きします。
JPanelのなかにOverlayLayoutで2枚のJPanel(上にglassPane、下にcontentPane)を配置し、overがtrueになったらglassPaneに色を書くようにしたいと思っています。

ですが、下のcontentPane部分にボタンなどがあると、その部分にうまく色がつきません。

どうすればいいのでしょうか。よろしくお願いします。
自分で組んでみたコードを示します。
******

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JLabel{

private JPanel glassPane;
private JPanel contentPane = new JPanel();
private JButton button1 = new JButton("OverlayTest");
private boolean over = false;

public Test(){

glassPane = new JPanel(){
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
if(!over)return;
Graphics2D g2 = (Graphics2D) g;
g2.setColor(new Color(Color.MAGENTA.getRed(), Color.MAGENTA.getGreen(), Color.MAGENTA.getBlue(), 150));
g2.fillRect(0, 0, this.getWidth(), this.getHeight());
}
};

button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setOver(!over);
glassPane.repaint();
//glassPane.revalidate();
}
});

contentPane.setLayout(new GridBagLayout());
contentPane.add(button1);

glassPane.setOpaque(false);

setLayout(new OverlayLayout(this));
add(glassPane);
add(contentPane);

}

public void setOver(boolean over){
this.over = over;
}

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.add(new Test());

frame.setSize(500,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

A 回答 (1件)

この場合は、OverlayLayoutを使わず、JFrameのsetGlassPaneにより、ホンモノのグラスペインを使ってください。

グラスペインとして使うコンポーネントを、透明にしたり色つきにしたりすればいいでしょう。

この回答への補足

JFrame#setGlassPaneを使えば確かにうまくできました。
ですが、実は2枚以上色付きのコンポーネントを重ねるために、このようなコンポーネントを作りたかったのです。

このままの状態(JPanelを継承したコンポーネント上に配置して)で解決する方法はないでしょうか。
もしくは、OverlayLayoutを使って2つのコンポーネントを重ねたコンポーネントをつくり、それをGlassPaneにセットするしかないのでしょうか。
よろしくお願いします。

補足日時:2008/12/09 00:13
    • good
    • 0
この回答へのお礼

ずいぶん昔の質問ですが、ひょんなことから原因がわかったので、同じ問題に悩まれている方の為に一応追記しておきます。(いないかもしれませんが)
どうやらフォーカスがあるコンポーネントが最前面になるように描画されるようで、そのためにフォーカスがあったボタンに色がつかなかったようです。
グラスペインは例外的にフォーカスがあるコンポーネントよりも全面に描画されるのでグラスペインにすれば大丈夫。
というわけで解決策は、覆いたいコンポーネントでrequestFocusしれやればいいということでした。

ありがとうございました。

お礼日時:2010/11/01 21:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!