【问题标题】:Selecting two or more shapes at the same time同时选择两个或多个形状
【发布时间】:2018-08-28 19:54:37
【问题描述】:

我被这个问题困住了:

当我在一个形状内单击时(有一个矩形和圆形的数组列表),我选择它(仅用于调试,将其颜色更改为蓝色)。因此,如果我在外部单击空白处,我会取消选择它(仅用于调试,将其颜色更改为以前的颜色)。

        for(int i=0; i<images.size(); i++){
        //checking if the click is inside a shape
            if((images.get(i).getLocation().getX() < e.getX() && images.get(i).getLocation().getY() < e.getY() && images.get(i).getX() + images.get(i).getWidth() > e.getX() && images.get(i).getLocation().getY() + images.get(i).getHeight() > e.getY())){ 
                images.get(i).setColor(Color.BLUE);
                images.get(i).setIsSelected(true);
        //debugging
                JOptionPane.showMessageDialog(null, images.get(i).getIsSelected());
                repaint();
                //JOptionPane.showMessageDialog(null, colors.get(i));
            }
            else{
                images.get(i).setColor(colors.get(i));
        //debugging
                JOptionPane.showMessageDialog(null, images.get(i).getIsSelected());
                images.get(i).setIsSelected(false);
                repaint();
                }

例如,假设有 2 个圆形和 1 个矩形,全部为黑色。我的代码有以下工作流程:

  • 在矩形内单击
  • 将其颜色更改为蓝色
  • 仅出于调试目的,它会打印“selected == true”(对于矩形)、“selected = false”(对于第一个圆圈)、“selected = false”(对于第二个圆圈)
  • 点击空白处
  • 将矩形的颜色更改为之前的颜色(黑色)
  • 仅出于调试目的,它会打印“selected == false”(对于矩形)、“selected = false”(对于第一个圆圈)、“selected = false”(对于第二个圆圈)
  • 再次在矩形内单击
  • 将其颜色更改为蓝色
  • 仅出于调试目的,它会打印“selected == true”(对于矩形)、“selected = false”(对于第一个圆圈)、“selected = false”(对于第二个圆圈)
  • 在圆圈内单击
  • 将其颜色更改为蓝色
  • 只是为了调试,它打印“selected == true”(对于矩形),“selected = true”(对于第一个圆圈),“selected = false”,(对于第二个圆圈)
  • 问题是:矩形的颜色变回黑色。它应该仍然是蓝色的。

如何同时选择 2 个或更多形状?

【问题讨论】:

    标签: java 2d drawing draw shape


    【解决方案1】:

    您的“if”子句设置最近选中项的颜色并将其设置为选中; "else" 子句将所有其他项目重置为未选中并重置颜色。

    这不是正确的方法。

    您应该有一个包含图像及其所有属性的 Shape 类。这些属性之一是当前是否选择了该形状。然后,当您重新绘制时,将 Graphics 传递给 Shape 类中的一个方法,该方法将图像重新绘制为选中或未选中。

    您应该在一个单独的循环中将所有项目设置为未选中,并且只有在第一个循环未确定点击是在对象中时才会进入该循环。

    boolean found = false;
    for ( Shape s : images ) {
      if ( click is in s ) {
         s.setSelected(true);
         found = true;
         break;
       }
    } 
    if ( !found ) {
       // set all images to unselected here
    }
    repaint();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多