如果我创建一个继承自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);
}
}
答案 0 :(得分:1)
您的鼠标侦听器正常工作,因为它只能在JComponent的范围内运行。要向自己证明这一点,请在组件周围放置一个边框,以查看它实际涵盖的内容:
public Node(int xx, int yy, int r) {
//. ....
setBorder(BorderFactory.createTitledBorder("Node"));
}
了解您正在将组件添加到默认(BorderLayout.CENTER)位置的BorderLayout使用容器中,从而填充容器。设置组件的边界(您不应该做的事情)或设置其首选大小(通常应该避免的事情)并不重要。
为了我的钱,我将我的Node设为逻辑类,实现Shape接口,而不是扩展JComponent的类,然后我可以使用Shape contains(Point p)
每当我需要知道我的节点是否被点击时,该方法。