Прежде всего, не делайте рисунок на холсте.Это компонент AWT, и вы создаете приложение Swing.Используйте JPanel
для пользовательской картины.Затем вы переопределите метод paintComponent(...)
.Прочтите раздел из учебника Swing по Custom Painting для получения дополнительной информации.
Теперь вместо использования метода drawOval (...) для рисования кругов, вы должны изменить код рисования нарисовать объекты из ArrayList.
Итак, в конструкторе вашего класса рисования вам нужно создать ArrayList, содержащий объекты, которые вы хотите нарисовать:
circles = new ArrayList<Shape>()
int rows = 5;
for (int y=0;y< rows;y++)
{
for (int x=0;x<rows;x++)
{
circles.add( new Ellipse2D.Double((x + 1) * 150, (y + 1) *150, 100, 100) );
}
}
Это создаст ArrayList фигур, которые вы хотите нарисовать,В этом случае 25 кружков.
Теперь необходимо изменить код paintComponent()
, чтобы нарисовать каждую фигуру.Поэтому код будет выглядеть примерно так:
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
// Custom code to paint all the Circles from the List
Graphics2D g2d = (Graphics2D)g;
Color foreground = g2d.getColor();
g2d.setColor( Color.RED );
for (Shape shape : circles)
{
g2d.draw( shape );
}
}
Я хочу, чтобы они были кликабельными.
Причина, по которой мы внесли вышеуказанные изменения, заключается в том, что теперь вы можете добавитьMouseListener для вашей панели, а затем в событии mouseClicked вы можете теперь искать в ArrayList, содержащем круги, чтобы увидеть, какой круг нажал.Интерфейс Shape
реализует метод contains(...)
, поэтому вам просто нужно проверить каждый круг, чтобы увидеть, содержит ли он Точку, в которой была нажата мышь.
Итак, основная логика в `mouseClicked (...) метод будет:
Point p = event.getPoint();
for (Shape shape: circles)
{
if (shape.contains(p))
// do something
}