我有两个 JPanel。一个面板在 0,0 处绘制了一个 100x100 的矩形。另一个在 100、100 处绘制了一个 100x100 的矩形。我的问题是,当两个 JPanel 都绘制在 JFrame 的内容窗格上时,一个 JPanel(最后一个绘制的)覆盖另一个,隐藏了它的图形。下面是绘制两个矩形的过于简化的代码以及我尝试过的东西。
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();
}
}
如果有人关心我为什么要这样做,
我正在创建游戏突破。我是一名新手程序员,对博弈论一无所知。所以我决定避免大量渲染和缓冲的最聪明的方法是拥有四个 JPanel。背面的静态 JPanel 上绘制了图像(有趣的背景图像)。一个 JPanel,上面画着桨。一个 JPanel,上面画着砖块。还有一个 JPanel,上面画了一个球。我的理由是,如果桨没有被移动,我不必重新绘制桨,背景和没有被击中的砖块。如果一个砖块被击中,我将更新一个砖块数组列表并在相应的 JPanel 上调用 repaint。