Ладно, это не будет коротким
Начнем с ....
frame = new JFrame();
circle = new Circle();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(circle);
circle.addMouseListener(new Click());
frame.setSize(300, 300);
frame.setVisible(true);
Хорошо, кажется достаточно простым, но одно, что вы упущен тот факт, что JFrame
по умолчанию использует BorderLayout
- это означает, что он заставит дочерний компонент (и центральную / стандартную позицию) заполнить все доступное пространство видимого пространства фреймов
Вы можете увидеть это, если сделаете что-то вроде ...
frame = new JFrame();
circle = new Circle();
circle.setBackground(Color.RED);
Теперь вы увидите, что компонент Circle
занимает весь фрейм, поэтому, когда вы нажимаете на него, вы нажимаете Circle
сам компонент.
Это неплохо, но вы можете немного изменить такт. Вместо того, чтобы добавлять MouseListener
независимо от Circle
, пусть компонент Circle
использует свой собственный MouseListener
, например ...
class Circle extends JPanel {
public Circle() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// More to come...
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(150, 140, 30, 30);
}
}
Это означает, что вы можете многое контролировать. логики c внутри класса, упрощает доступ к более важной информации без необходимости делать кучу потенциально опасных приведений.
Итак, теперь нам просто нужно добавить logi c in, чтобы определить, была ли нажата мышь в желаемом месте или нет ...
public void mouseClicked(MouseEvent e) {
Point point = e.getPoint();
if (point.x >= 150 && point.x <= 150 + 30 && point.y >= 140 && point.y <= 140 + 30) {
System.out.println("You clicked me :(");
}
}
Хорошо, это ... basi c
Мы можем упростить немного и использовать доступные функции в более широком API, используя API "фигур", например ...
class Circle extends JPanel {
private Ellipse2D dot = new Ellipse2D.Double(150, 140, 30, 30);
public Circle() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Point point = e.getPoint();
if (dot.contains(point)) {
System.out.println("You clicked me :(");
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.red);
g2d.fill(dot);
g2d.dispose();
}
}
Преимущество этого, помимо contains
, заключается в том, что мы может относительно легко изменить положение формы, и наш оператор if
содержит для работы ?
Я, очень, рекомендую также взглянуть на