【发布时间】:2012-02-27 04:05:28
【问题描述】:
我在使用将元素(绘制的矩形和椭圆)存储在 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);
感谢您的帮助。谢谢你。
【问题讨论】:
-
您应该使用 Iterator.remove() 方法从 ArrayList 中删除项目。阅读collections。
-
或向后遍历 ArrayList。如果您通过向前迭代来绘制项目,这实际上是有意义的,因为您希望单击激活最顶部的项目。
-
@Max - 这不是 OP 的真正问题,而且由于集合是一个 ArrayList,因此在性能方面几乎没有什么区别。
标签: java graphics event-handling arraylist