Как я могу изменить цвет прямоугольника?

#javafx

#javafx

Вопрос:

Где я ошибаюсь в своей логике, чтобы просто изменить цвет прямоугольника при нажатии?

         square.setFill(null);
        square.setStroke(Color.BLACK);
        setAlignment(Pos.CENTER);
        getChildren().addAll(square);

        setOnMouseClicked(event ->{
            if(event.getButton() == MouseButton.PRIMARY) {              
                square.setFill(Color.BLUE);
            }
            else if(square.getFill().equals(Color.BLUE)) {
                    square.setFill(Color.BLACK);
            }


        });
  

Комментарии:

1. Что произойдет, если вы пройдете через setOnMouseClicked, проходит ли он по двум разным путям, как ожидалось?

2. Когда я нажимаю на квадрат, он становится абсолютно черным, пропуская код «Превратить синий»

3. К какому объекту вы вызываете setOnMouseClicked ? Похоже, что вы не вызываете это на square ; похоже, что вы вызываете это на this .

4. Вы вообще щелкаете левой кнопкой мыши?

Ответ №1:

Я думаю, вам не требуется логический флаг. То, что вы делаете, можно сделать следующим образом:

 setOnMouseClicked(event -> {
    if (event.getButton() == MouseButton.PRIMARY) {
       square.setFill(square.getFill() == Color.BLUE ? Color.BLACK : Color.BLUE);
    }
});
  

Ответ №2:

В итоге я использовал логическое значение, чтобы указать, является ли прямоугольник синим или нет.

         square.setFill(null);
        square.setStroke(Color.BLACK);
        setAlignment(Pos.CENTER);
        getChildren().addAll(square);

        setOnMouseClicked(event ->{
            if(event.getButton() == MouseButton.PRIMARY) {              
                if(!isBlue) {
                    square.setFill(Color.BLUE);
                    isBlue = true;
                }
                else if(isBlue) {

                    square.setFill(Color.BLACK);
                    isBlue = false;
                }
            }
        });
  

Ответ №3:

Проблема, с которой вы можете столкнуться при использовании переменной, заключается в том, что у вас должна быть переменная, которую вы отслеживаете для каждого объекта, изменение цвета которого вы хотите поддерживать, иначе все ваши объекты, которые меняют цвет, будут запускаться с помощью одной переменной.

Я думаю, вы можете сохранить свой исходный код, я думаю, проблема в вашем операторе if:

 setOnMouseClicked(event ->{
    if(event.getButton() == MouseButton.PRIMARY) {              
        square.setFill(Color.BLUE);
    }
    else if(square.getFill().equals(Color.BLUE)) {
            square.setFill(Color.BLACK);
    }
  

Если вы посмотрите на это, условие таково, что getButton является основным, и если true, он всегда будет устанавливать его на синий, и если пользователь не использовал основную кнопку, он будет установлен на черный, только если цвет синий.

Вы хотите что-то вроде:

 setOnMouseClicked(event ->{
    if(event.getButton() == MouseButton.PRIMARY) {              
       if(!square.getFill().equals(Color.BLUE)) {
           square.setFill(Color.BLUE);
       }
       else
               square.setFill(Color.BLACK);
       }
   }
}