Java 使用JLayer阻止画布的输入

Java 使用JLayer阻止画布的输入,java,swing,canvas,awt,jlayer,Java,Swing,Canvas,Awt,Jlayer,我正在尝试编写代码,该代码利用JLayer阻止事件进入由该层装饰的组件。然而,我想不出一个办法来做到这一点 。这是一个pastebin链接,因为当我尝试使用它时,代码插入总是破坏格式 public class Window extends JFrame{ private static boolean blockInput = true; private CustomCanvas canvas = new CustomCanvas(); public static vo

我正在尝试编写代码,该代码利用
JLayer
阻止事件进入由该层装饰的组件。然而,我想不出一个办法来做到这一点

。这是一个pastebin链接,因为当我尝试使用它时,代码插入总是破坏格式

public class Window extends JFrame{

    private static boolean blockInput = true;
    private CustomCanvas canvas = new CustomCanvas();

    public static void main(String[] args) {
    new Window().setVisible(true);
    }

    public Window() {
    canvas.addMouseListener(canvas);
    LayerUI<Canvas> layerUI = new CanvasLayerUI();
    JLayer<Canvas> canvasLayer = new JLayer<Canvas>(canvas, layerUI);
    add(canvasLayer);
    setSize(800, 600);
    }

    private class CanvasLayerUI extends LayerUI<Canvas> {

    @Override
    public void eventDispatched(AWTEvent e, JLayer<? extends Canvas> l) {
        if (blockInput) {
        if (e instanceof InputEvent) {
            ((InputEvent) e).consume();
        }
        } else {
        super.eventDispatched(e, l);
        }
    }

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        if (c instanceof JLayer) {
        JLayer<?> layer = (JLayer<?>) c;
        layer.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
        }
    }

    @Override
    protected void processMouseEvent(MouseEvent e, JLayer<? extends Canvas> l) {
        super.processMouseEvent(e, l);
        if (e.getID() == MouseEvent.MOUSE_CLICKED) {
        System.out.println("Mouse click on layer: " + e.getPoint());
        }
    }
    }

    private class CustomCanvas extends Canvas implements MouseListener {

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("Mouse click on canvas: " + e.getPoint());
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
    }
}
公共类窗口扩展JFrame{
私有静态布尔块输入=true;
私有CustomCanvas画布=新CustomCanvas();
公共静态void main(字符串[]args){
新窗口().setVisible(true);
}
公共窗口(){
canvas.addMouseListener(canvas);
LayerUI LayerUI=新画布LayerUI();
JLayer canvasLayer=新JLayer(canvas,layerUI);
添加(画布层);
设置大小(800600);
}
私有类画布LayerUI扩展LayerUI{
@凌驾
公共无效事件(AWTEvent e、JLayer)c;
layer.setLayerEventMask(awteEvent.MOUSE\u EVENT\u MASK);
}
}
@凌驾

受保护的void processMouseEvent(MouseEvent e,JLayer您的层似乎与
JComponent
一起工作,例如
JPanel
。另请参见和

import java.awt.AWTEvent;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.event.InputEvent;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JLayer;
导入javax.swing.JPanel;
导入javax.swing.plaf.LayerUI;
公共类MyWindow扩展了JFrame{
私有布尔块输入=true;
私有CustomPanel=新CustomPanel();
公共静态void main(字符串[]args){
EventQueue.invokeLater(()->{
新建MyWindow().setVisible(true);
});
}
公共MyWindow(){
setDefaultCloseOperation(关闭时退出);
LayerUI LayerUI=新画布LayerUI();
JLayer canvasLayer=新JLayer(面板,层);
添加(画布层);
包装();
setLocationRelativeTo(空);
}
私有类画布LayerUI扩展LayerUI{
@凌驾
公共无效事件(AWTEvent e、JLayer)c;
layer.setLayerEventMask(awteEvent.MOUSE\u EVENT\u MASK);
}
}
@凌驾

受保护的无效进程mouseevent(MouthEngEt,Jayelto格式,选择代码块并点击括号图标。是<代码> java?AWT.Cuavas您的扩展?作为另一个考虑,考虑<代码> MouseAdapter <代码>。是,<代码> java。AWT.Cuavas,以及为什么我不使用<代码> MouseAdapter <代码>,是因为我计划实现所有的鼠标侦听器方法,I只是显示了我的一些测试代码。而且,当我使用代码块时,它只是“扁平化”我的缩进和我必须手动放入四个空格来缩进代码,使其看起来正确,这是一个麻烦。如果你愿意,我很乐意将代码编辑到问题中。
这是一个粘贴库链接,因为在我尝试使用它时,代码插入总是破坏格式。
为什么你的其他问题没有问题uestions?例如,。我发布了所有空格或所有选项卡的代码,效果很好。修复代码以保持一致,您就不会有问题。我在其他问题中手动将代码缩进四个空格,因为我通常只发布几行。
import java.awt.AWTEvent;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayer;
import javax.swing.JPanel;
import javax.swing.plaf.LayerUI;

public class MyWindow extends JFrame {

    private boolean blockInput = true;
    private CustomPanel panel = new CustomPanel();

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new MyWindow().setVisible(true);
        });

    }

    public MyWindow() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        LayerUI<JPanel> layerUI = new CanvasLayerUI();
        JLayer<JPanel> canvasLayer = new JLayer<>(panel, layerUI);
        add(canvasLayer);
        pack();
        setLocationRelativeTo(null);
    }

    private class CanvasLayerUI extends LayerUI<JPanel> {

        @Override
        public void eventDispatched(AWTEvent e, JLayer<? extends JPanel> l) {
            if (blockInput) {
                if (e instanceof InputEvent) {
                    ((InputEvent) e).consume();
                }
            } else {
                super.eventDispatched(e, l);
            }
        }

        @Override
        public void installUI(JComponent c) {
            super.installUI(c);
            if (c instanceof JLayer) {
                JLayer<?> layer = (JLayer<?>) c;
                layer.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
            }
        }

        @Override
        protected void processMouseEvent(MouseEvent e, JLayer<? extends JPanel> l) {
            super.processMouseEvent(e, l);
            if (e.getID() == MouseEvent.MOUSE_CLICKED) {
                System.out.println("Mouse click on layer: " + e.getPoint());
            }
        }
    }

    private class CustomPanel extends JPanel {

        public CustomPanel() {
            this.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Mouse click on canvas: " + e.getPoint());
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(640, 480);
        }
    }
}