1

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ますか?

4

1 に答える 1