首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改形状列表的颜色

更改形状列表的颜色
EN

Stack Overflow用户
提问于 2018-08-23 13:36:04
回答 2查看 591关注 0票数 2

我被困在这个问题上:

当我点击一个形状(有一个矩形和圆圈的列表),它会改变它的颜色。但当我点击外面,它不会变回。

代码语言:javascript
运行
复制
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();
            }
        }
    }

我应该使用一系列的颜色吗?不知道我怎么能解决这个问题。为了澄清我想要存档的内容,下面是一个例子:

如果列表中包含一个紫色的矩形,我希望它在点击里面时变成蓝色(这很有效)。然后,当我单击矩形外部时,我希望它回到紫色(这不起作用)。

我已经试过里昂的建议了,但没有用。我哪里做错了?

更具体的说,当我只画一个形状时,它是有效的!但是,例如,我画了一个蓝色的矩形,一个紫色的圆圈和一个红色的矩形,然后点击里面的一些形状,比如红色的矩形,每个形状都将其颜色更改为蓝色。当我再次单击“外部”时,它会将每个形状的颜色更改为默认颜色(黑色)。

代码语言:javascript
运行
复制
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();
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-23 14:20:53

在正确的想法中使用颜色列表的想法(除非所有对象在开始时都有相同的颜色)。在这个列表中,您可以存储所有对象的初始颜色和可以执行的操作。

代码语言:javascript
运行
复制
// 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列表的位置)。

票数 2
EN

Stack Overflow用户

发布于 2018-08-23 14:20:42

以下是我认为正在发生的事情:

  • 用户单击形状内的鼠标,形状的颜色被设置为蓝色。
  • 用户点击鼠标外部的形状,我们把颜色设置为colorAux,这是由图像的颜色,这是蓝色的!

你需要把原来的颜色保存在某个地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51987115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档