2012-02-27 56 views
1

我在用图形绘制程序将元素(绘制矩形和椭圆)存储在ArrayList中时遇到了问题。我想从列表中删除特定的矩形和椭圆,首先用鼠标左键选择元素,然后用鼠标右键删除它。但是,问题是我的程序会删除一个矩形或椭圆,而不是先用鼠标左键选中它(也就是说,我可以右键点击任何节点,并在选定之前删除它)。Java:从ArrayList中删除元素并添加文本

我宣布GraphElements的ArrayList作为

ArrayList <GraphElement> element = new ArrayList<GraphElement>(); 

的MousePressListener里面,我有困难是部分(代码setLabel部分是有关我的下一个问题):

for (int i = 0; i < element.size(); i++) 
    { 
    GraphElement el = (GraphElement)element.get(i); 
     el.isSelected(x, y); // isSelected method (functioning correctly) to check whether the coordinates are inside the bounds of the rectangle or ellipse 
     if (el.isSelected(x,y)) 
     {     
      if (event.getButton() == MouseEvent.BUTTON3) // delete a node 
      element.remove(i).isSelected(x, y); 
      if (setLabel) 
     { 
      el.setLabel(label); 
      setLabel = false; 
      repaint(); 
     } 
     } 
} 

其次,我想添加一个标签到选定的矩形或椭圆。这是在我的程序中完成的,选择矩形或椭圆来添加文本,将文本输入到JTextField中,然后选择JButton以应用更改。但是,我的问题是,按下JButton后,组件上没有绘制标签。我必须再次按下鼠标按钮才能显示文字。我想这是因为我的MousePressListener中有setLabel。但是我需要在添加文本之前选择元素,所以我不知道如何去做这件事。

下面是标签的ActionListener:

class addLabel implements ActionListener { 
    public void actionPerformed(ActionEvent e) 
    { 
     component.setLabel(labelField.getText()); 
    } 
    } 
    addLabel label = new addLabel(); 
    labelButton.addActionListener(label); 

我感谢所有帮助。谢谢。

+1

您应该使用Iterator.remove()方法从ArrayList中删除项目。阅读[集合](http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html)。 – tenorsax 2012-02-27 04:28:00

+0

或者向后遍历ArrayList。如果您通过向前迭代来绘制项目,这实际上是有意义的,因为您希望点击来激活最上面的项目。 – 2012-02-27 04:33:55

+0

@Max - 这不是OP的真正问题,并且由于该集合是一个ArrayList,所以它在性能方面几乎没有什么区别。 – 2012-02-27 04:46:50

回答

1

这种说法看起来十分可疑:

element.remove(i).isSelected(x, y); 

这似乎是说

“从列表中删除第i个元素,然后进行测试,看是否x, y是在它”

您想要测试在移除它之前是否选择了第i个元素。