g를 사용하여 원을 그려서 paintComponent (Graphics g) 메서드를 재정의하는 JComponent에서 상속하는 새 클래스를 만드는 경우 MouseListener가 트리거되도록하려면 무엇을 수정해야합니까? 구성 요소의 경계 내부를 클릭하면 어떻게됩니까?자바 : 사용자 정의 JComponent에 MouseListener 추가
구성 요소의 생성자에서 setBounds (...)를 추가 한 다음 MouseListener를 추가했기 때문에 사용자 정의 구성 요소가있는 컨테이너 안의 아무 곳이나 클릭 할 때마다 발생합니다. .
내 구성 요소 내에서 이벤트가 발생했는지 여부를 mouseClicked() 메소드에서 확인하고 싶지는 않습니다. 클릭이 내부에있을 때만 호출되기를 원합니다. 그것은 단지 당신의 JComponent에의 범위 내에서 작동으로 마우스 리스너가 제대로 작동
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);
}
}
코드를주세요. 그리고'paintMethod (Graphics g)'가 없으므로'paintComponent (Graphics g)'를 오버라이드 (override)한다는 의미가되기를 바랍니다. –
실수로 사과드립니다. 수정하여 코드를 추가했습니다. – user