我陷入了这个问题:
当我在一个形状(有矩形和圆形的列表)中单击时,它会更改其颜色。但是当我在外面单击时,它不会变回来。
public void mouseClicked(MouseEvent me) {
Color colorAux;
for (int i=0; i<images.size(); i++) {
colorAux = images.get(i).getColor();
if (images.get(i).getShape() == "Rectangle") {
if ((images.get(i).getLocation().getX() < me.getX() && images.get(i).getLocation().getY() < me.getY() && images.get(i).getX() + images.get(i).getWidth() > me.getX() && images.get(i).getLocation().getY() + images.get(i).getHeight() > me.getY())) {
images.get(i).setColor(Color.BLUE);
repaint();
JOptionPane.showMessageDialog(null, colorAux); //Debug
} else if (!(images.get(i).getLocation().getX() < me.getX() && images.get(i).getLocation().getY() < me.getY() && images.get(i).getX() + images.get(i).getWidth() > me.getX() && images.get(i).getLocation().getY() + images.get(i).getHeight() > me.getY()) && (images.get(i).getColor() == Color.BLUE)) {
images.get(i).setColor(colorAux);
repaint();
}
}
}
我应该使用多种颜色吗?不知道该怎么解决。为了阐明我要归档的内容,下面是一个示例:
如果列表包含一个紫色矩形,则我希望在其内部单击时将其更改为蓝色(有效)。然后,当我在矩形外部单击时,希望它变回紫色(不起作用)。
我已经尝试过莱昂的建议,但是没有用。我在哪里做错了?
更具体地说,当我仅绘制1个形状时,它会起作用!但是例如,我绘制了一个蓝色矩形,一个紫色圆圈和一个红色矩形,然后在一些形状内部单击,例如红色矩形,每个形状的颜色都更改为 BLUE 。当我再次在外部单击时,它将每个形状的颜色更改为默认颜色(黑色)。
public void mouseClicked(MouseEvent me){
List<Color> colors = new ArrayList<Color>();
for(int j=0; j<images.size(); j++){
colors.add(images.get(j).getColor());
}
for(int i=0; i<images.size(); i++){
if((images.get(i).getLocation().getX() < me.getX() && images.get(i).getLocation().getY() < me.getY() && images.get(i).getX() + images.get(i).getWidth() > me.getX() && images.get(i).getLocation().getY() + images.get(i).getHeight() > me.getY())){
images.get(i).setColor(Color.BLUE);
repaint();
}
else{
images.get(i).setColor(colors.get(i));
repaint();
}
答案 0 :(得分:2)
您的想法是在正确的想法中使用颜色列表(除非所有对象在开始时都具有相同的颜色)。在此列表中,您将存储所有对象的初始颜色,并且您可以做到
// initialColors is the list holding the initial colors
for (int i=0; i<images.size(); i++) {
if (images.get(i).getShape() == "Rectangle") {
if (/*code to check if we are inside the rectangle which you already have*/) {
images.get(i).setColor(Color.BLUE);
repaint();
} else {
images.get(i).setColor(initialColors.get(i));
repaint();
}
} /* maybe add a case for getShape() == "Circle" */
}
您可以与initialColors
列表同时创建并填充images
列表(因为那一刻,您知道每种形状具有哪种颜色)。
关于您的方法为何不起作用的原因:假设我们在一个矩形内单击,其颜色变为蓝色。现在,当我们使用colorAux = images.get(i).getColor()
来获取颜色时,我们会得到蓝色,因为我们更改了矩形的颜色。然后,我们到达images.get(i).setColor(colorAux)
时,将蓝色矩形的颜色设置为蓝色,这意味着什么也没有发生。
此外,您不需要else if
,而可以使用else
,因为第一个if
检查单击是否发生在矩形内。这意味着当单击在矩形内 not 时,我们将执行else分支,我们只需在其中重置颜色即可。
编辑:现在您添加到问题中的更改不起作用,因为我们仍然遇到相同的问题:我们在mouseClicked
事件中获得颜色,而不是在形状最初被着色时。这意味着我们用当前颜色(可能已更改为蓝色)而不是初始颜色填充颜色列表。您应该将添加的循环移动到最初为形状着色的位置(可能是在填充images
列表的位置)。
答案 1 :(得分:1)
这就是我想发生的事情:
您需要将原始颜色保存在某个地方。