同时选择两个或多个形状

时间:2018-08-28 19:54:37

标签: java 2d drawing draw shape

我陷入了这个问题:

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

        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个或更多形状?

1 个答案:

答案 0 :(得分:2)

您的“ 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();
相关问题