Как я могу сделать набор интерактивных кругов в Java с помощью Canvas? - PullRequest
0 голосов
/ 19 мая 2018

поэтому я сделал сетку из 25 кругов, используя холст, и хочу, чтобы они были кликабельными.Клики должны быть в состоянии выполнять функцию.Как я могу это сделать?

Мой код:

import javax.swing.JFrame; //JFrame Class
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;

   public class Driver extends Canvas
   {
      public void paint( Graphics g) {
         g.setColor(Color.RED);
         int rows = 5;
        for (int y=0;y< rows;y++)
            {
            for (int x=0;x<rows;x++)
               {
               g.drawOval((x + 1) * 150, (y + 1) *150, 100, 100);
               }

             }

      }
      public static void main(String[] args)
      {
         JFrame f = new JFrame("Flow"); //new JFrame
         Driver t = new Driver();
         f.setSize(900,900);//sets size of frame

         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//sets default close operation

         f.setVisible(true);//makes panel visible
         f.add(t);

        }
}

1 Ответ

0 голосов
/ 19 мая 2018

Прежде всего, не делайте рисунок на холсте.Это компонент 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
}
...