Выбор двух или более фигур одновременно - PullRequest
0 голосов
/ 28 августа 2018

Я застрял на этой проблеме:

Когда я щелкаю внутри фигуры (есть список прямоугольников и окружностей), я выбираю ее (только для отладки, меняет цвет на СИНИЙ). Поэтому, если я щелкаю снаружи, в пустом месте, я отменяю выбор (только для отладки, меняет цвет на предыдущий).

        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» (для 1-го круга), «selected = false», (для 2-го круга)
  • Нажмите в пустое пространство
  • Изменить цвет прямоугольника на предыдущий цвет (черный)
  • Только для отладки выводит «selected == false» (для прямоугольника), «selected = false» (для 1-го круга), «selected = false», (для 2-го круга)
  • Снова щелкните внутри прямоугольника
  • Измените его цвет на СИНИЙ
  • Просто для отладки выводит «selected == true» (для прямоугольника), «selected = false» (для 1-го круга), «selected = false», (для 2-го круга)
  • Нажмите внутри круга
  • Изменить цвет на СИНИЙ
  • Только для отладки выводит «selected == true» (для прямоугольника), «selected = true » (для 1-го круга), «selected = false», (для 2-го круга )
  • Проблема в том, что цвет прямоугольника снова становится ЧЕРНЫМ. Это должно быть еще СИНИЙ.

Как я могу выбрать 2 или более фигур одновременно?

1 Ответ

0 голосов
/ 28 августа 2018

Ваше предложение "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();
...