gpt4 book ai didi

Java:将 MouseListener 添加到自定义 JComponent

转载 作者:行者123 更新时间:2023-12-01 12:10:12 26 4
gpt4 key购买 nike

如果我创建一个继承自 JComponent 的新类,我通过使用 g 绘制一个圆圈来重写其 PaintComponent(Graphics 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);
}
}

最佳答案

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

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

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

为了我的钱,我会让我的 Node 成为一个逻辑类,一个实现 Shape 接口(interface)的类,而不是扩展 JComponent 的类,然后我可以使用 Shape 的 contains(Point p) 每当我需要知道我的节点是否已被单击时,方法。

关于Java:将 MouseListener 添加到自定义 JComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27323709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com