Кнопка переключения .isSelected () имеет значение true, но визуально не изменяется в JavaFX - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь сделать индикатор с помощью переключателя.Он будет «светиться», когда его «Выбранное» значение истинно.И не «подсвечивать», когда это «выбранное» значение ложно.Я добавил обычную кнопку только для проверки форматирования визуальных элементов на кнопке переключения.В реальной программе «огни» будут контролироваться другими методами.

Проблема в том, когда я устанавливаю, toggleBtn.setSelected (true);это не обновляет визуальные эффекты.Если я вызываю toggleBtn.isSelected ();он возвращает true, поэтому я знаю, что он обновляется, но не визуально.Если я предварительно выберу кнопку переключения, щелкнув ее в программе перед нажатием кнопки «Тест», она переключится на отключенную графику.Но он не вернется к визуальным эффектам.

Я искал все, и мне кажется, что мне нужно добавить слушателя, но я не уверен, как это поможет обновить визуальные эффекты?

Ниже приведены соответствующие частикод.Если вам нужно больше, пожалуйста, дайте мне знать.

Контроллер

@FXML
private void LightsTest(ActionEvent event) throws InterruptedException {
    System.out.println("Light illuminated");
    toggleBtn.setSelected(true);
    System.out.println("Light is Selected: " + toggleBtn.isSelected());

    Thread.sleep(1000);

    System.out.println("Light not illuminated");
    toggleBtn.setSelected(false);
    System.out.println("Light is Selected: " + toggleBtn.isSelected());
}

FXML

<AnchorPane id="mainPane" prefHeight="600.0" prefWidth="1024.0" stylesheets="@CSSFile.css" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
<children>
    <ToggleButton id="Light" fx:id="toggleBtn" mnemonicParsing="false" styleClass="warningLights" text="LIGHT ON" />
    <Button id="testBtn" fx:id="lightsBtn" layoutX="427.0" layoutY="30.0" mnemonicParsing="false" onAction="#LightsTest" prefHeight="49.0" prefWidth="106.0" text="TEST LIGHTS" />
</children>
</AnchorPane>

CSS

.warningLights {
    -fx-background-color: linear-gradient(#132233 5%, #465566 50%, #132233 95%);
    -fx-background-radius: 15px;
    -fx-border-width: 5px;
    -fx-border-radius: 15px 15px 15px 15px;
    -fx-font-size: 18px;
    -fx-font-weight: bold;
}

.warningLights:selected {
    -fx-background-color: linear-gradient(#EE0000 5%, #FDA8A8 50%, #EE0000 95%);
    -fx-effect: dropshadow(three-pass-box, black, 10, 0.0, 1, 5);
}

Спасибо всем!

1 Ответ

0 голосов
/ 07 октября 2018

Вы устанавливаете свойство selected на true, а затем обратно на false тем же методом, и все за один раз.Это не будет работать, как ожидалось.Когда состояние изменяется, графический интерфейс не будет отражать изменения до следующего импульса макета.Но состояние true не будет видно при следующем импульсе компоновки, поскольку указанный импульс возникнет только через некоторое время после возврата LightsTest.Другими словами, изменение состояния узлов не немедленно обновляет графический интерфейс.

Существует дополнительная проблема, вызванная использованием Thread.sleep.Этот метод вызывается в потоке приложений JavaFX .При парковке в Thread.sleep Поток приложений JavaFX не может выполнять какую-либо другую работу, и графический интерфейс пользователя зависает.Помните золотое правило JavaFX: Никогда не останавливайтесь и не выполняйте длительную работу над Потоком приложения JavaFX .Это относится и ко многим другим инфраструктурам пользовательского интерфейса, таким как Swing / AWT и Thread Dispatch Thread .


Несвязанные: следуя надлежащим соглашениям об именах Java, ваш метод должен бытьназывается lightsTest, а не LightsTest.

...