Java - 如何使用 OverlayLayout LayoutManager 将画布放在彼此之上?

Java - How can I put canvases on top of each other using the OverlayLayout LayoutManager?

我想将 2 个 Canvas 对象放在彼此的顶部。他们的背景应该是透明的(我还没有解决这个问题)。我想要一种简单的方法来处理类似 Photoshop 的图层。我想尽可能少地使用 Swing 对象。

我有一个包含 2 个 canvas 的 Container 对象,它们都画了不同的线。我已将 OverlayLayout LayoutManager 附加到容器,它应该覆盖 canvases 而不是将它们并排放置。

但我的代码只显示第一个 canvas。如何让第二个显示在另一个之上?

代码如下:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.OverlayLayout;

public class Main {

    public Main() {
        // Create a window to draw into:
        Frame window = new Frame();
        window.addWindowListener(new WindowAdapter() {
            public void windowClosing (WindowEvent we) {
                System.exit(0);
            }
        });
        window.setSize(600,400);
        //
        // Create a Container for the MyCanvas instances:
        Container container = new Container();
        // Set the LayoutManager of the container:
        OverlayLayout layoutManager = new OverlayLayout(container);
        container.setLayout(layoutManager);
        //
        // Create 2 MyCanvas instances that each draw a line:
        MyCanvas canvas1 = new MyCanvas(75, 75);
        container.add(canvas1);
        MyCanvas canvas2 = new MyCanvas(135, 300);
        container.add(canvas2);
        //
        window.add(container);
        window.setVisible(true);
    }

    public static void main(String[] args) {
        Main app = new Main();
    }   

    public class MyCanvas extends Canvas {

        int x2;
        int y2;

        public MyCanvas (int x2, int y2) {
            this.setSize(600,400);
            this.setLocation(0,0);
            this.x2 = x2;
            this.y2 = y2;
        }

        public void paint (Graphics g) {
            g.drawLine(0, 0, this.x2, this.y2);
        }
    }
}

感谢您的帮助!

How can I get the second one to show up on top of the other one?

Their backgrounds should be transparent (I did not address this yet).

您已经回答了自己的问题。您需要使顶部组件透明。

不要使用 Canvas 进行自定义绘画。相反,您可以使用 JPanel。然后重写 paintComponent(...) 方法来进行自定义绘画。并且不要忘记在方法开始时调用 super.paintComponent(...)

阅读有关 Custom Painting 的 Swing 教程部分,了解更多信息和工作示例。

然后当您使用 JPanel 时,您可以通过以下方式使其透明:

panel.setOpaque( false );

此外,您通常会使用 JPanel 作为两个自定义绘制面板的容器。

使用教程中的示例时,不要忘记复制 invokeLater(...) 代码,以便在 EDT 上创建您的 GUI。那就是从教程中的工作示例开始,然后修改示例以添加您的要求,这样您就有了一个比您刚刚发布的代码结构更好的程序。