Переключение графических точек по щелчку мыши


Я делаю программу, в которой можно щелкнуть по окну, и точка будет помещена туда. Если пользователь нажмет еще раз, точка будет удалена. Программно каждый щелчок создает новый экземпляр другого класса под названием "элемент", который содержит позиции (X, Y) для одной точки.

Чтобы добиться этого, я расширение jpanel и реализации MouseListener. Чтобы нарисовать точки, я переопределяю метод paint (). Каждый раз, когда пользователь нажимает, код Муселистенера mouseReleased() либо добавляет в ArrayList, либо удаляет из него, затем вызывает paint (), где экран очищается и ArrayList перерисовывается.

Проблема, с которой я сталкиваюсь, заключается в том, что точки не исчезают при нажатии на них. Я не знаю, то ли это мое непонимание paint (), то ли что-то связанное с ArrayList.

Вот моя краска ():

public void paint(Graphics g)
{
    // Clear screen
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, getWidth(), getHeight());

    // Display what elements will be drawn (for debugging)
    System.out.println("About to draw the following elements:");
    for (Element e : elements)
    {
        System.out.println("t" + e);
    }

    // Draw Elements
    g.setColor(Color.BLACK);
    for(int i=0; i < elements.size(); i++)
    {
        g.fillOval(elements.get(i).x, elements.get(i).y, 10, 10);
    }

}

А вот метод щелчка мышью:

public void mouseReleased(MouseEvent e)
{
    // Rounds to the nearest grid space (spacing is currently 20px)
    int roundX = (int) ((float)(Math.round(e.getX() / GRID_SPACING)) * GRID_SPACING);
    int roundY = (int) ((float)(Math.round(e.getY() / GRID_SPACING)) * GRID_SPACING);

    System.out.println("Clicked (" + roundX + ", " + roundY + ")");

    // Go through each element...
    for (int i=0; i < elements.size(); i++)
    {
        // if an element exists at the coordinates clicked,
        if (elements.get(i).getX() == roundX && elements.get(i).getY() == roundY)
        {
            // remove it from the elements list
            elements.remove(i);
            i--;
            System.out.println("tElement exists at (" + roundX + ", " + roundY + "). Removing it.");
        }
    }

    elements.add(new Element(roundX, roundY));

    repaint();
}

Результат этого выглядит следующим образом:

  About to draw the following elements: (None)

Clicked (140, 100)
About to draw the following elements:
    This element's coordinates are (140, 100)

Clicked (160, 100)
About to draw the following elements:
    This element's coordinates are (140, 100)
    This element's coordinates are (160, 100)

Clicked (140, 100)
    Element exists at (140, 100). Removing it.
About to draw the following elements:
    This element's coordinates are (160, 100)
    This element's coordinates are (140, 100)
2 3

2 ответа:

Вы не должны add(new Element(roundX, roundY)), если элемент был удален в предыдущем цикле

Не переопределяйте paint(Graphics) в панели качания. Вместо этого используйте paintComponent(Graphics).