Флажок JavaFX изменяет размер при нажатии на другой элемент управления

#css #javafx #checkbox

#css #javafx #флажок

Вопрос:

Когда я нажимаю на флажок, он изменяет размер, затем, после того как он установлен, щелкните другой элемент управления в графическом интерфейсе, который не является флажком, и размер флажка изменится примерно на 1 пиксель. Как я могу это остановить? Я включил gif, чтобы показать, что я имею в виду.

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 —