我正在尝试编写代码,该代码利用 aJLayer
来阻止事件进入被层装饰的组件。但是,我想不出办法来做到这一点。
这是一个 SSCCE。这是一个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) {
}
}
}
我搜索了一些开发人员试图完全按照我正在做的事情的示例,而我找到的最佳答案是该线程上的最后一篇文章之一。基本上,建议是InputEvent
在eventDispatched
. LayerUI
在我的示例中,我尝试这样做(当blockInput
标志设置为 时true
),但它不会阻止输入进入Canvas
-"Mouse clicked on canvas"...
消息仍被打印。但是,"Mouse clicked on layer"...
没有打印,因此使用该事件似乎只会阻止事件JLayer
在Canvas
. 作为绝望的尝试,我也尝试在没有运气的情况下消耗MouseEvent
内部processMouseEvent
。
我担心问题可能是因为Canvas
是 AWT 组件,而不是轻量级的 Swing 组件。不幸的是,它必须是Canvas
我正在编写的应用程序的 AWT。
有没有人设法阻止输入事件进入由 装饰的重量级组件JLayer
?