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

时间:2015-06-06 09:57:24

标签: java swing awt overlay

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

我有一个包含2个画布的Container对象,它们都绘制了不同的行。我已将OverlayLayout LayoutManager附加到容器上,该容器应覆盖画布而不是将它们放在一起。

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

以下是代码:

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);
        }
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

如何让第二个显示在另一个之上?

     

他们的背景应该是透明的(我还没有解决这个问题)。

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

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

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

然后,当您使用JPanel时,使用以下方法使其透明:

panel.setOpaque( false );

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

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