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 时,底层组件的事件将被阻止。

AJLayeredPane可以用作最顶层的容器来MouseEvents使用您当前的侦听器来捕获。

注意:在 Swing 中覆盖paintComponent而不是paint自定义绘画,并记住调用super.paintComponent(g).

于 2013-01-25T19:13:13.960 回答