#css #javafx #checkbox
#css #javafx #флажок
Вопрос:
Когда я нажимаю на флажок, он изменяет размер, затем, после того как он установлен, щелкните другой элемент управления в графическом интерфейсе, который не является флажком, и размер флажка изменится примерно на 1 пиксель. Как я могу это остановить? Я включил gif, чтобы показать, что я имею в виду.
.check-box {
-fx-background-radius: 20px;
-fx-background-color: linear-gradient(to right, #030045, #002869);
-fx-text-fill: #ffffff;
-fx-padding: 6px 10px;
}
.check-box > .box {
-fx-background-radius: 8px;
-fx-background-color: white;
-fx-padding: 3px;
}
.check-box:selected > .box > .mark,
.check-box:indeterminate > .box > .mark {
-fx-background-color: #030045;
}
Редактировать: я создал новый пустой проект без контейнеров (например, HBox) и добавил ту же таблицу стилей, и я по-прежнему получаю ту же ошибку, что означает, что это должно быть связано с CSS и не имеет ничего общего с размером других элементов управления или макетов.
Ответ №1:
Это связано с проходимостью узла, когда CheckBox
находится в фокусе, он выделяет узел (который вы не можете видеть из-за CSS).
Ниже приведен некоторый пример кода, в котором вы можете включать и выключать проходимый характер CheckBox
.(Я использую тот же CSS, что и выше, в моей таблице стилей)
Ниже приведен JavaDoc, который рассказывает вам больше об setFocusTraversable
функции
public class Main extends Application {
@Override
public void start(Stage stage) {
VBox vBox = new VBox();
Scene scene = new Scene(vBox);
scene.getStylesheets().add(String.valueOf(getClass().getClassLoader().getResource("StyleSheetTest.css")));
CheckBox checkBox = new CheckBox("Test CheckBox");
checkBox.setFocusTraversable(false);
Button button = new Button("Other Control");
ToggleButton toggleButton = new ToggleButton("FocusTraversable:False");
toggleButton.setOnAction(event -> {
if(toggleButton.isSelected()){
toggleButton.setText("FocusTraversable:True");
checkBox.setFocusTraversable(true);
} else {
toggleButton.setText("FocusTraversable:False");
checkBox.setFocusTraversable(false);
}
});
vBox.getChildren().addAll(checkBox, button, toggleButton);
vBox.setAlignment(Pos.CENTER);
stage.setScene(scene);
stage.show();
}
}
Javadoc:
setFocusTraversable
public final void setFocusTraversable(boolean value)
Устанавливает значение свойства focusTraversable.
Описание свойства: Указывает, должен ли этот узел быть частью цикла обхода фокуса. Когда это свойство имеет значение true, фокус может быть перемещен на этот узел и с этого узла с помощью обычных ключей обхода фокуса. На рабочем столе такими клавишами обычно являются TAB для перемещения фокуса вперед и SHIFT TAB для перемещения фокуса назад. При создании сцены система направляет фокус на узел, переменная focusTraversable которого имеет значение true и который имеет право получать фокус, если фокус не был установлен явно с помощью вызова
requestFocus()
.Значение по умолчанию: false
Источник: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#setFocusTraversable-boolean —