更改形状列表Java的颜色

时间:2018-08-23 13:36:04

标签: java geometry draw shapes

我陷入了这个问题:

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

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

2 个答案:

答案 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)

这就是我想发生的事情:

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

您需要将原始颜色保存在某个地方。