0

私がやろうとしていること:互いに垂直で、マウスが指している場所に接する垂直線と水平線を描きます。一種のカーソルトラッカー。

私の構造:JFrame->CustomPanel->他のパネル/コンポーネントなど。

CustomPanelはJPanelを継承し、JFrameのContentPaneとして設定されます。

GlassPaneを使用しようとしましたが、すべてが完全に機能しましたが、イベントを無効にするのではなく、保持したいと思います。それでもボタンなどをクリックできるようにしたい。

関連する質問は、Swingのコンポーネントの上にあるこのペイントですか?。CustomPanelの空の場所にマウスを移動すると、すべてが期待どおりに動作しますが、それでも他のコンポーネントの上にペイントされません。

画像では、ボタンの上にペイントを続ける必要がありましたが、ボタンを入力すると停止し、終了すると再開しました。

ここに画像の説明を入力してください

以下のコード。

public class Painter {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        JFrame frame = new JFrame();

        frame.setSize(600, 600);
        frame.setPreferredSize(new Dimension(600, 600));
        frame.setContentPane(new CustomPanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class CustomPanel extends JPanel {
    int x = 0;
    int y = 0;

    public CustomPanel() {

        addMouseListener(new AdapterImplementation(this));
        addMouseMotionListener(new AdapterImplementation(this));
        add(new JButton("TESTBTN"));
        setSize(new Dimension(600, 600));
        setPreferredSize(new Dimension(600, 600));
        setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawLine(0, y, getWidth(), y);
        g.drawLine(x, 0, x, getHeight());
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }
}

と私のアダプター:

public class AdapterImplementation extends MouseAdapter {
    CustomPanel pane;

    public AdapterImplementation(CustomPanel pane) {
        this.pane = pane;
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        pane.setX(x);
        pane.setY(y);
        pane.repaint();
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("MOUSE MOVED");
        int x = e.getX();
        int y = e.getY();
        pane.setX(x);
        pane.setY(y);
        pane.repaint();
    }
}
4

1 に答える 1

2

ここでの問題は、がに登録されているMouseListenersが登録されてCustomPanelいないJButtonため、後者はリスナーからのイベントを処理しないことです。

また、これまで見てきたように、GlassPaneを使用すると、基盤となるコンポーネントへのイベントがブロックされます。

Aは、現在のリスナーを使用しJLayeredPaneてキャプチャするための最上位のコンテナとして使用できます。MouseEvents

注: SwingのカスタムペイントpaintComponentの代わりにオーバーライドpaintし、を呼び出すことを忘れないでsuper.paintComponent(g)ください。

于 2013-01-25T19:13:13.960 に答える