编程语言
首页 > 编程语言> > java – 具有多个图层的JFrame

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