Удалить форму при нажатии на внутреннюю область - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь написать программу, которая позволит мне удалить фигуру, если щелкнуть правой кнопкой мыши внутри фигуры. Мой подход состоял в том, чтобы включить метод, чтобы найти минимальную и максимальную координаты X и Y фигуры и удалить его, если щелкнуть мышью, если координаты X и Y щелчка находятся между этими координатами. Прямо сейчас мой код просто удаляет последнюю фигуру, которую я породил в списке массивов фигур.

public class RemoveCircle extends JPanel 
{

    private JFrame framey;
    private JPanel panels1;
    Circle c1 = new Circle(100,100);

    private int x, y;
    MouseClicks ms1;
    ArrayList<Circle> circles = new ArrayList<Circle>();

    private int clickcount;

    public RemoveCircle()
    {
        framey = new JFrame("RemoveCircle");
        framey.setSize(900,900);
        ms1 = new MouseClicks();

        //circles.add(new Circle(x,y));//This may be the original circle being added
        this.setBackground(Color.BLACK);
        this.setPreferredSize(new Dimension(900,900));
        framey.add(this);

        framey.pack();
        framey.setVisible(true);
        this.addMouseListener(ms1);

    } 

    public class Circle
    {
        int x, y;
        Color c1;
        int minsx, maxsx, minsy, maxsy;

        public Circle(int x, int y) 
        {
            this.x = x; this.y = y;
            c1 = getRandoColor();
        }

        public void draw(Graphics g)
        {
            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(c1);
            g2d.fillOval(x,y,50,50);
        }

        Random numGenerator = new Random();  
        private Color getRandoColor()
        {
            return new Color(numGenerator.nextInt(255), numGenerator.nextInt(255), numGenerator.nextInt(255));
        }

        public int getMinY(int y)
        {minsy = y - 25; return minsy; }

        public int getMaxY(int y)
        {maxsy = y + 25; return maxsy; }

        public int getMinX(int x)
        {minsx = x - 25; return minsx; }

        public int getMaxX(int x)
        {maxsx = x + 25; return maxsx; }


    }
    @Override
    protected void paintComponent(Graphics g)
    {
        //if (clickcount < 10) 
        {
            super.paintComponent(g);
            for (Circle cr : circles)
                cr.draw(g);
        }
    }

    public class MouseClicks implements MouseListener
    {
        int b, y, x ;
        int circlecount;
        public void mouseClicked(MouseEvent m) 
        {
            int x = m.getX(), y = m.getY();  b = m.getButton();
            this.x = x; 
            this.y = y;

            if (b == 1 && circlecount < 10) //Left Click
            {
                circles.add(new Circle(x-25, y-25)); //x-40 and y - 75
                RemoveCircle.this.repaint();
                circlecount++;

            }
            if (b == 3) //Left Click
            { for (Circle c : circles)
                {
                    if ((x >= c.getMinX(x) && x <= c.getMaxX(x)) && (y >= c.getMinY(y) && y <= c.getMaxY(y)))
                    {
                        circles.remove(c);
                        RemoveCircle.this.repaint();
                        circlecount--;
                    }   
                }
            }
        }

        public void mouseExited(MouseEvent m) {}
        public void mousePressed(MouseEvent m) {}
        public void mouseEntered(MouseEvent m) {}
        public void mouseReleased(MouseEvent m) {}
    }
}

1 Ответ

0 голосов
/ 04 ноября 2018

Более простой подход - использовать интерфейс Shape. Форма может быть кругом или прямоугольником и т. Д. Затем можно использовать метод Shape.contains(...), чтобы определить, находится ли щелчок мыши в границах формы.

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

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

Ваш объект хранится в вашем ArrayList, и ваша логика рисования теперь выглядит примерно так:

super.paintComponent(g);

Graphics2D g2d = (Graphics2D)g;

for (ShapeInfo info : shapes)
{
    g2d.setColor( info.getColor() );
    g2d.draw( info.getShape() );
}

Затем код в вашем MouseListner будет проходить через тот же ArrayList и вызывать метод contains(...) для каждого Shape. Когда вы находите совпадение, вы удаляете запись из ArrayList.

Вы можете использовать класс Ellipse2D.Double для формы круга. Посмотрите пример DrawOnComponent, приведенный в Пользовательские подходы к рисованию , для примера, который рисует прямоугольники с использованием этого базового подхода.

...