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