我被困在这个问题上:
当我点击一个形状(有一个矩形和圆圈的列表),它会改变它的颜色。但当我点击外面,它不会变回。
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();
}
}
}
我应该使用一系列的颜色吗?不知道我怎么能解决这个问题。为了澄清我想要存档的内容,下面是一个例子:
如果列表中包含一个紫色的矩形,我希望它在点击里面时变成蓝色(这很有效)。然后,当我单击矩形外部时,我希望它回到紫色(这不起作用)。
我已经试过里昂的建议了,但没有用。我哪里做错了?
更具体的说,当我只画一个形状时,它是有效的!但是,例如,我画了一个蓝色的矩形,一个紫色的圆圈和一个红色的矩形,然后点击里面的一些形状,比如红色的矩形,每个形状都将其颜色更改为蓝色。当我再次单击“外部”时,它会将每个形状的颜色更改为默认颜色(黑色)。
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();
}
}
}
发布于 2018-08-23 14:20:53
在正确的想法中使用颜色列表的想法(除非所有对象在开始时都有相同的颜色)。在这个列表中,您可以存储所有对象的初始颜色和可以执行的操作。
// 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
检查单击是否发生在矩形内。这意味着,当单击不在矩形内时,我们执行else分支,并且可以简单地重置其中的颜色。
编辑:现在,您添加到问题中的更改不起作用,因为我们仍然有相同的问题:我们在mouseClicked
事件中获得颜色,而不是当形状最初被着色时。这意味着我们用当前的颜色(可能已经更改为蓝色)来填充颜色列表,而不是最初的颜色。您应该将添加的循环移动到最初显示形状的位置(可能是填充images
列表的位置)。
发布于 2018-08-23 14:20:42
以下是我认为正在发生的事情:
你需要把原来的颜色保存在某个地方。
https://stackoverflow.com/questions/51987115
复制相似问题