JLayer
レイヤーによって装飾されているコンポーネントにイベントが移動するのをブロックするためにa を使用するコードを作成しようとしています。しかし、私はそれを行う方法を理解できません。
ここに SSCCE があります。コードを使用しようとすると、コードの挿入によって常に書式設定が削除されるため、これはペーストビンリンクです。
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) {
}
}
}
私が行っていることを正確に実行しようとしている開発者の例をいくつか検索しましたが、見つけた最良の答えは、このスレッドの最後の投稿の 1 つでした。InputEvent
基本的に、提案はのeventDispatched
メソッドでを消費することでしたLayerUI
。私の例では、(blockInput
フラグが に設定されている場合true
)それを試みましたが、入力が に行くのをブロックしませんCanvas
-"Mouse clicked on canvas"...
メッセージはまだ出力されています。ただし、"Mouse clicked on layer"...
は出力されないため、イベントを消費しても 内でイベントが処理されないように見えるだけですが、JLayer
に行かないようにする必要がありますCanvas
。必死の試みとして、私も運が悪かったのでMouseEvent
内部を消費しようとしました.processMouseEvent
Canvas
問題は、軽量の Swing コンポーネントではなく、AWT コンポーネントである可能性があることを懸念しています。Canvas
残念ながら、私が書いているアプリケーションの AWT であることが不可欠です。
で装飾された重いコンポーネントにブロック入力イベントを送信することに成功した人はいJLayer
ますか?