Я делаю программу, в которой можно щелкнуть окно, и там будет размещена точка. Если пользователь щелкнет снова, точка будет удалена. Программно, каждый щелчок создаст новый экземпляр другого класса с именем «Элемент», который содержит позиции (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)