java – 具有多个图层的JFrame
作者:互联网
我有一个有两层的窗口:静态背景和包含移动对象的前景.我的想法是只绘制一次背景(因为它不会改变),所以我将更改面板透明并将其添加到静态背景之上.这是以下代码:
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次重新计算和重新绘制更改面板.
解决方法:
当您将透明组件重新绘制在另一个组件上方时,您仍然会“弄脏”下方组件,导致它被重新绘制.如果您没有重新绘制下层,则会在其上方获得图像的拖尾效果.
此处唯一可用的优化不是重新生成较低级别上使用的图像.每次上面的图层更改时,仍然需要将光栅绘制到图形缓冲区.
标签:java,swing,performance,jcomponent,javax-swing-timer 来源: https://codeday.me/bug/20190715/1472595.html