さて、まず、ここで何が間違っているかを説明します -JFrame
は ではなく、オーバーライドする必要JComponent
はありません。paintComponent
あなたのコードはおそらく決して呼び出されません。それとは別にdrawRect
、長方形を描くだけで、塗りつぶしはしません。
ただし、これを行う適切な方法があると思います。
を使用しているため、 を介しJFrame
てコンテナのレイヤード ペインJFrame.getLayeredPane
を利用する必要があります。
レイヤード ペインは、重なっているコンポーネントを重ねて表示できる深さのあるコンテナーです。レイヤード ペインに関する一般的な情報は、 レイヤード ペインの使用方法 にあります。このセクションでは、ルート ペインが階層化されたペインを使用する方法の詳細について説明します。
ルート ペインについては、Java チュートリアルの一部であるHow to Use Root Panesで説明されています。階層化されたペインはルート ペインの子でありJFrame
、最上位のコンテナとして、下にある を利用しJRootPane
ます。
とにかく、背景の作成に興味があるので、階層化されたペインがトップレベルのコンテナー内で一般的にどのように見えるかについては、次の図を参照してください。
以下の表は、各レイヤーの使用目的を説明し、各レイヤーに対応する JLayeredPane 定数を示しています。
画層名-値-説明
FRAME_CONTENT_LAYER
- new Integer(-30000)
- ルート ペインは、メニュー バーとコンテンツ ペインをこの深さのレイヤード ペインに追加します。
背景がコンテンツの背後にあることを指定したいので、次のように、最初に同じレイヤー ( JLayeredPane.FRAME_CONTENT_LAYER
) に追加します。
final JComponent background = new JComponent() {
private final Dimension size = new Dimension(screenwidth, screenheight);
private Dimension determineSize() {
Insets insets = super.getInsets();
return size = new Dimension(screenwidth + insets.left + insets.right,
screenheight + insets.bottom + insets.top);
}
public Dimension getPreferredSize() {
return size == null ? determineSize() : size;
}
public Dimension getMinimumSize() {
return size == null ? determineSize() : size;
}
protected void paintComponent(final Graphics g) {
g.setColor(Color.BLACK);
g.fillRect(0, 0, screenwidth, screenheight);
}
};
final JLayeredPane layeredPane = frame.getLayeredPane();
layeredPane.add(background, JLayeredPane.FRAME_CONTENT_LAYER);
ここで、コンテンツの前に背景を確実に描画するために、以下を使用しますJLayeredPane.moveToBack
。
layeredPane.moveToBack(background);