Как выбрать круг из списка Список, чтобы удалить из JFrame? - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть JFrame со случайными кругами (они генерируются случайным образом).Я хочу удалить выделенные круги щелчком мыши из Jframe и увеличить счет в соответствии с этим удалением. Любая идея?

"У меня есть таймер, который может создать новый круг на экране. Также яЯ использовал List для хранения созданных кругов. (Ссылаясь на класс Public Circle) У меня есть функция сжатия, а также для сокращения кругов во времени путем уменьшения радиуса. "

private static final int WIDTH = 700;
private static final int HEIGHT = 700;
public int x, y; 

private static final int D_W = 500;
private static final int D_H = 500;

private List<Circle> circles;
Random random = new Random();
public int randRadius;
public int delay = 50; 
public static int Life=10;
public static int Score=0;
        private List<Circle> circles;
public static int Score=0;
    public GameModel() {
                setSize(WIDTH,HEIGHT); //setting the Frame width and height                 
                circles = new ArrayList<>();
                Timer timer = new Timer(250, new ActionListener() {
                 //timer for creating a new ball on JFrame
                    @Override
                    public void actionPerformed(ActionEvent e) {

                        int randX = random.nextInt(D_W);  //or whatever the width of your panel is
                        int randY = random.nextInt(D_H);  //or whatever the height of your panel is
                        randRadius = random.nextInt(101) + 50; //radius
                        Color color = Color.BLUE;

                        Circle circle = new Circle(randRadius, color, randX, randY);
                        circles.add(circle);
                        update(); //it is simply repaint();
                    }
                });
                timer.start();
            }

    @Override
            protected void paintComponent(Graphics g) { //draw the circle randomly
                super.paintComponent(g);      
                for (Circle circle : circles) {         
                circle.drawCircle(g);     
                }
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(D_W, D_H);
            }
    public class Circle { //class for shrinking the balls in time
                public int radiuss, x, y;
                Color color;

                public Circle(int radius, Color color, int x, int y) {
                    this.radiuss = radius;
                    this.color = color;
                    this.x = x;
                    this.y = y;
                    ActionListener counter = new ActionListener(){
                        public void actionPerformed(ActionEvent evt){
                            update();
                            radiuss--;
                        }};
                        new Timer (delay, counter).start();
                }

                public void drawCircle(Graphics g) {
                    g.setColor(color);
                    g.fillOval(x, y, radiuss * 2, radiuss * 2);                 
                }
            }

    private class ClickCircle extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
                    selected = null;
                    ...                     
                    if (selected != null) {
                        Score++;
                        System.out.println("Score" + Score);
                    }
                }

            }

1 Ответ

0 голосов
/ 08 декабря 2018

Не создавайте свой собственный класс Круга.Вместо этого вы можете использовать класс Ellipse2D.Double(...).

Класс Ellipse2D реализует интерфейс Shape.Интерфейс Shape реализует метод contains(...).Таким образом, вы можете перебирать все Объекты в своем Списке и проверять, содержит ли Shape точку мыши.

Так что я бы назвал, чтобы вы изменили класс Circle на класс ShapeInfo.Этот класс будет содержать два свойства:

  1. Форма
  2. Цвет

Таким образом, ваш базовый код будет:

//Circle circle = new Circle(randRadius, color, randX, randY);
//circles.add(circle);
Shape shape = new Ellipse2D.Double(...);
ShapeInfo info = new ShapeInfo(shape, color);
shapes.add( info );

В будущем вы можете даже добавить Rectangle фигуры или любую другую фигуру, которую вы хотите, в свой список.

См. Игра с фигурами для получения более общей информации об этой концепции.

update(); //it is simply repaint();

Тогда просто вызовите repaint ().Это правильный способ вызова компонента для правильной перекраски.

...