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

标签 java swing awt overlay

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

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

但我的代码只显示第一个 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(...)

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

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

panel.setOpaque( false );

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

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

关于Java - 如何使用 OverlayLayout LayoutManager 将 Canvas 放在彼此之上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681429/

相关文章:

java - 在 hadoop 中使用 ImageJ 并获得 awt headless 异常

Java:实现转换 View 模式,使用 XSL 文件将 XML 转换为 HTML

java - 盒子布局问题

java.lang.IllegalStateException : Could not execute method of the activity caused by Invocation and NPE error

Java - 使用 hibernate 读取从 MYSQL 查询返回的列表

java - 如何更改 JTextArea 中的文本颜色?

java - Java 中的 GridLayout 帮助

java - 在矩形内创建字符串

Java KeyListener 事件循环直到释放键

Java 独立的 ActionListener 和一个总体的 ActionListener