【问题标题】:Java: Add MouseListener to custom JComponentJava:将 MouseListener 添加到自定义 JComponent
【发布时间】:2015-02-04 02:02:04
【问题描述】:

如果我创建一个继承自 JComponent 的新类,我重写了它的 paintComponent(Graphics g) 方法,通过使用 g 绘制一个圆圈,我应该修改什么以便仅当我在边界内单击时触发 MouseListener组件?

因为在我的组件的构造函数中,我添加了 setBounds(...),然后添加了一个 MouseListener,但是每次我单击自定义组件所在的容器内的任何位置时都会触发它,而不仅仅是在我单击它时触发。

我不想在 mouseClicked() 方法中检查事件是否发生在我的组件内部,我希望仅在单击内部时调用它。

这是我的代码:

public class Node extends JComponent {
    private int x, y, radius;

    public Node(int xx, int yy, int r) {
        x = xx;
        y = yy;
        radius = r;
        this.setBounds(new Rectangle(x - r, y - r, 2 * r, 2 * r));
        setPreferredSize(new Dimension(2 * r, 2 * r));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D gr = (Graphics2D) g;
        gr.setColor(Color.BLACK);
        gr.drawOval(x - radius, y - radius, 2 * radius, 2 * radius);
    }

    public static void main(String[] args) {
        final JFrame f = new JFrame();
        f.setSize(new Dimension(500, 500));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        Node n = new Node(100, 100, 25);
        n.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                System.out.println("clicked");
            }
        });
        p.add(n);
        f.add(p);
        f.setVisible(true);
    }
}

【问题讨论】:

  • 请输入代码?我希望你的意思是你覆盖了paintComponent(Graphics g),因为没有paintMethod(Graphics g)
  • 我为我的错误道歉,我已更正并添加了代码。

标签: java swing mouselistener jcomponent


【解决方案1】:

您的鼠标侦听器工作正常,因为它只在您的 JComponent 范围内运行。为了向自己证明这一点,请在您的组件周围放置一个边框以查看它实际覆盖的内容:

public Node(int xx, int yy, int r) {
   //. ....
   setBorder(BorderFactory.createTitledBorder("Node"));
}

了解您正在将组件添加到默认 (BorderLayout.CENTER) 位置的使用 BorderLayout 的容器中,因此它会填充容器。设置组件的边界(不应该做的事情)或设置其首选大小(通常也应该避免的事情)并不重要。

为了我的钱,我会让我的 Node 成为一个逻辑类,一个实现 Shape 接口的类,而不是一个扩展 JComponent 的类,然后我可以在需要知道我的节点已被点击。

【讨论】:

  • 我看到了问题。如果我重写 getPreferredSize() 方法,并使用 FlowLayout 一切正常。如果我想动态修改组件的大小,正确的布局是什么?谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2013-06-29
相关资源
最近更新 更多