我有一个有两层的窗口:静态背景和包含移动对象的前景。我的想法是只绘制一次背景(因为它不会改变),所以我使更改面板透明并将其添加到静态背景之上。这是代码:
public static void main(String[] args) {
JPanel changingPanel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(100, 100, 100, 100);
}
};
changingPanel.setOpaque(false);
JPanel staticPanel = new JPanel();
staticPanel.setBackground(Color.BLUE);
staticPanel.setLayout(new BorderLayout());
staticPanel.add(changingPanel);
JFrame frame = new JFrame();
frame.add(staticPanel);
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
这段代码给了我我想要的正确图像,但每次我重新绘制changingPanel
, staticPanel
也会被重新绘制(这显然违背了只绘制一次静态面板的整个想法)。有人可以告诉我出了什么问题吗?
仅供参考,我正在使用 javax.swing.Timer 每秒重新计算并重新绘制不断变化的面板 24 次。
当您在另一个透明组件之上重新绘制透明组件时,您仍然会“弄脏”下部组件,从而导致它被重新绘制。如果您没有重新绘制下层,则会在其顶部得到图像的涂抹效果。
这里唯一可用的优化是不重新生成较低级别上使用的图像。每次上面的图层发生变化时,仍然需要将光栅绘制到图形缓冲区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)