2014-11-10 4 views
0

Когда я нажимаю мышью в JPanel, программа создает зеленую точку и отображает счетчик на экране для количества точек. Точки находятся в списке массивов, сохраненных как объекты. Я пытаюсь изменить этот код, чтобы, если я нажму в радиусе существующей точки (каждый с радиусом 6), эта точка исчезнет из списка и будет удалена с экрана.Как удалить объект из списка массивов после события мыши?

(Перед тем, как спросить, да, вы не можете признать это как проблема домашних заданий и нет, я не пытаюсь обмануть)

Я понял, что это включает в себя создание для цикла для сканирования объектов в пределах массива, глядя для получения объектов, на которые мог щелкнуть указатель. Однако я смущен, как это сделать точно

Спасибо!

public class DotsPanel extends JPanel 
{ 
    private final int SIZE = 6; // radius of each dot 

    private ArrayList<Point> pointList;// "Point"s are objects that rep. the x & y coordinates of a dot 





    public DotsPanel() 
    { 
     pointList = new ArrayList<Point>(); 

     addMouseListener (new DotsListener()); 

     setBackground(Color.black); 
     setPreferredSize(new Dimension(300, 200)); 
    } 




    public void paintComponent(Graphics page) 
    { 
     super.paintComponent(page); 

     page.setColor(Color.green); 

     for (Point spot : pointList) 
     page.fillOval(spot.x-SIZE, spot.y-SIZE, SIZE*2, SIZE*2); 



     page.drawString("Count: " + pointList.size(), 5, 15);//draws the image of the counter 




    } 




    private class DotsListener implements MouseListener 
    { 


     public void mousePressed(MouseEvent event) 
     { 
     pointList.add(event.getPoint()); 
     repaint(); 
     } 


     public void mouseClicked(MouseEvent event) {} 
     public void mouseReleased(MouseEvent event) {} 
     public void mouseEntered(MouseEvent event) {} 
     public void mouseExited(MouseEvent event) {} 
    } 
} 
+0

pointList.contains (event.getPoint()) - возвращает true, если arraylist содержит значение, иначе false –

ответ

1

Очевидно, что вам необходимо изменить реализацию mousePressed() в DotsListener, потому что вы не хотите, чтобы безоговорочно добавить новую точку на каждом клике. Я бы предложил изменить его на что-то вроде этого:

public void mousePressed(MouseEvent event) 
    { 
    Point hitDot = getHitDot(event); 
    if (hitDot == null) { 
     // no dots hit 
     pointList.add(event.getPoint()); 
    } else { 
     // hit a dot 
     pointList.remove(hitDot); 
    } 
    repaint(); 
    } 

Поскольку это домашнее задание, я не буду писать getHitDot для вас. Я скажу, что у вас есть правильная идея: проведите по всем элементам pointList, протестировав каждый Point и немедленно вернув его, если находится на расстоянии SIZE от мыши. Вы можете использовать формулу Euclidean distance для выполнения теста ударов для каждой точки.

Смежные вопросы