【问题标题】:Changing colors of a list of shapes java更改形状列表java的颜色
【发布时间】:2019-01-29 21:51:34
【问题描述】:

我被这个问题困住了:

当我在一个形状(有一个矩形和圆形列表)内单击时,它会改变它的颜色。但是当我在外面点击时,它并没有变回来。

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();
            }
        }
    }

我应该使用一组颜色吗?不知道我该如何解决这个问题。为了澄清我要归档的内容,这里有一个示例:

如果列表包含一个紫色矩形,我希望它在单击它时变为蓝色(有效)。然后,当我在矩形外单击时,我希望它变回紫色(这不起作用)。

我已经尝试过 Leon 的建议,但没有奏效。我哪里做错了?

更具体地说,当我只绘制 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();
        }
    }
}

【问题讨论】:

  • 能否请您澄清一下您希望(或期望)发生的事情,例如,当单击形状外部时您希望发生什么?
  • @Leon 哦,对不起!我只想用之前选择的颜色上色。为了澄清,一个例子是:我画了一个紫色矩形>所以我在里面点击以将其颜色更改为蓝色>然后我点击外部并再次将其颜色更改为紫色
  • 所以是else if 条件不起作用?
  • 我认为这就是发生的事情:您在单击时将颜色设置为蓝色。您再次单击,现在颜色为蓝色,您将其设置为蓝色
  • @Arnaud else if,因为不会变回以前的颜色。

标签: java geometry draw shapes


【解决方案1】:

您在正确的想法中使用颜色列表的想法(除非所有对象一开始都具有相同的颜色)。在此列表中,您存储所有对象的初始颜色,您可以这样做

// 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" */
}

您可以与images 列表同时创建和填充initialColors 列表(因为在那一刻,您知道每个形状的颜色)。

关于您的方法不起作用的原因:假设我们在一个矩形内单击,它的颜色变为蓝色。当我们现在使用colorAux = images.get(i).getColor() 来获取颜色时,我们得到蓝色,因为我们改变了矩形的颜色。当我们到达images.get(i).setColor(colorAux) 时,我们将蓝色矩形的颜色设置为蓝色,这意味着没有任何反应。

另外,您不需要else if 并且可以使用else 作为第一个if 检查点击是否发生在矩形内。这意味着当点击 not 在矩形内时我们执行 else 分支,我们可以简单地重置那里的颜色。

编辑:现在您添加到问题中的更改不起作用,因为我们仍然遇到同样的问题:我们在 mouseClicked 事件中获得颜色,而不是在最初为形状着色时。这意味着我们用当前颜色(可能已更改为蓝色)填充颜色列表,而不是初始颜色。您应该将添加的循环移动到最初为形状着色的位置(可能是填充images 列表的位置)。

【讨论】:

  • 感谢您的回答!我用一些坏消息编辑了帖子。
  • 谢谢,莱昂!现在它正在工作!但还有另一个问题。 :( 再次编辑了帖子..
  • 目前,代码只有if 的情况来处理矩形。要处理圆圈,您需要在我提供的代码片段的注释中添加我建议的else if 子句(以防您已经这样做了)。目前,该代码将更改您单击的所有形状的颜色(并将所有其他形状更改回来)。这意味着如果您单击位于多个形状内的区域(例如形状相交),所有这些都会改变颜色。您使用的 if 条件对我和循环来说都是正确的。这可能setColor 方法的问题。
  • 没关系,莱昂!它工作得很好!非常感谢你的帮助!当我删除一个形状时,我的代码也没有删除它的颜色。现在它正在工作!
  • 由于我的回答解决了您的问题,请考虑接受。如果您想了解更多关于如何处理 StackOverflow 上的问题的答案,请查看 this help article
【解决方案2】:

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

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

您需要将原始颜色保存在某处。

【讨论】:

  • 感谢您的帮助!我用一些坏消息编辑了帖子。
猜你喜欢
  • 2014-08-11
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2020-05-14
  • 2016-10-19
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多