如何在鼠标事件后从数组列表中删除对象?

时间:2014-11-10 05:34:38

标签: java arrays loops object jpanel

当我在JPanel中单击鼠标时,程序会创建一个绿点,并在屏幕上显示一个点数的计数器。点位于保存为对象的数组列表中。我正在尝试更改此代码,以便如果我在现有点(每个半径为6)的半径内单击,该点将从列表中消失并从屏幕中删除。

(在你问之前,是的,你可能认为这是一个家庭作业问题,不,我不是在试图作弊)

我认为这涉及创建一个for循环来扫描数组中的对象,寻找拾取指针可能点击的对象。但是我很困惑如何完成这个

谢谢!

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) {}
   }
}

1 个答案:

答案 0 :(得分: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公式对每个点执行命中测试。