私は2つのJPanelを持っています。1 つのパネルには、0,0 に描かれた 100x100 の長方形があります。もう1つは100、100で描画された100x100の長方形です。私の問題は、両方のJPanelがJFrameのコンテンツペインに描画されると、一方のJPanel(最後に描画されたもの)が他方を覆い、グラフィックを隠してしまうことです。以下は、2 つの長方形を描画する単純化されたコードと、私が試したことです。
package playground;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Playground{
public Playground(){
JFrame frame = new JFrame("My Frame");
frame.setSize(400, 400);
JPanel backPanel = new JPanel(){;
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Rectangle2D rect = new Rectangle2D.Double(0, 0, 100, 100);
g2.draw(rect);
}
};
JPanel frontPanel = new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Rectangle2D rect = new Rectangle2D.Double(150, 150, 100, 100);
g2.draw(rect);
}
};
frontPanel.setOpaque(true); //Does nothing
frontPanel.setBackground(new Color(0, 0, 0, 0)); //Does nothing
frontPanel.setForeground(new Color(0, 0, 0, 0)); //Erases the rectangle drawn
frame.getContentPane().add(backPanel);
frame.getContentPane().add(frontPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args){
System.out.println("Hello World");
new Playground();
}
}
なぜ私がこれをやりたいのか気になる人がいれば、
ゲームブレイクアウトを作成しています。私は初心者プログラマーで、ゲーム理論の知識はありません。そこで、大量のレンダリングとバッファリングを回避する最も賢明な方法は、4 つの JPanel を用意することだと判断しました。画像が描かれた一番後ろの静的 JPanel (楽しい背景画像)。パドルが描画された JPanel。レンガが描かれた JPanel。そして、ボールが描かれたJPanel。私の理論的根拠は、パドル、背景、およびヒットされていないレンガが動かされていない場合、パドルを再描画する必要がないということです。ブリックがヒットした場合、ブリックの arrayList を更新し、対応する JPanel で repaint を呼び出します。