Переключение графических точек при щелчке мышью - PullRequest
3 голосов
/ 12 февраля 2012

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

Чтобы добиться этого, я расширяю JPanel и внедряю MouseListener. Чтобы нарисовать точки, я переопределяю метод paint (). Каждый раз, когда пользователь щелкает, код MouseReleased () MouseListener либо добавляет в 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 ]

4 голосов
/ 12 февраля 2012

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

2 голосов
/ 12 февраля 2012

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

...