我正在尝试使用切换按钮使指示灯亮起。当它的“选定”值是true时,它将“点亮”。并且当“选定”值为false时,不“点亮”。我添加了常规按钮,只是为了测试切换按钮上视觉效果的格式。在实际程序中,“灯光”将在其他方法中进行控制。

问题是当我设置toggleBtn.setSelected(true);它不会更新视觉效果。如果我调用toggleBtn.isSelected();它返回true,所以我知道它正在更新,而不是视觉。如果在单击“测试”按钮之前在程序中单击它来“预先选择”切换按钮,它将切换到关闭的视觉效果。但这不会循环回到On视觉效果。

我搜索了所有内容,我认为似乎需要添加一个侦听器,但是我不确定这将如何帮助更新视觉效果?

以下是代码的相关部分。如果您需要更多信息,请告诉我。

控制者

@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());
}


XML文件

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


感谢大家!

最佳答案

要将selected属性设置为true,然后一次用相同的方法将其重新设置为false。这将无法正常工作。当状态更改时,GUI直到下一个布局脉冲才会反映更改。但是下一个布局脉冲不会看到true状态,因为该脉冲只会在LightsTest返回之后的某个时间出现。换句话说,修改节点的状态不会立即更新GUI。

您使用Thread.sleep会导致一个辅助问题。在JavaFX Application Thread上调用此方法。当停放在Thread.sleep中时,JavaFX Application Thread无法执行任何其他工作,并且GUI将冻结。记住JavaFX的黄金法则:永远不要冻结JavaFX Application Thread,也不要在JavaFX Application Thread上长期运行。这也适用于许多其他UI框架,例如Swing / AWT和事件调度线程。



无关:遵循正确的Java命名约定,您的方法应称为lightsTest,而不是LightsTest

关于java - 切换按钮.isSelected()为true,但在视觉上在JavaFX中未更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52685290/

10-10 16:29