为了账号安全,请及时绑定邮箱和手机立即绑定

切换按钮 .isSelected() 为真,但在 JavaFX 中视觉上没有变化

切换按钮 .isSelected() 为真,但在 JavaFX 中视觉上没有变化

森栏 2021-11-03 14:26:50
我正在尝试使用切换按钮制作指示灯。当它的“Selected”值为真时,它会“照亮”。当它的“Selected”值为false时,而不是“illuminate”。我添加了常规按钮只是为了测试切换按钮上视觉效果的格式。在实际程序中,“灯”将在其他方法中进行控制。问题是当我设置,toggleBtn.setSelected(true); 它不会更新视觉效果。如果我调用 toggleBtn.isSelected(); 它返回 true,所以我知道它正在更新,而不是视觉效果。如果我在单击“测试”按钮之前通过在程序中单击“预选”切换按钮,它将循环到关闭的视觉效果。但它不会循环回到 On 视觉效果。我已经搜索过了,我认为似乎我需要添加一个侦听器,但是我不确定这将如何帮助更新视觉效果?以下是代码的相关部分。如果您需要更多,请告诉我。控制器@FXMLprivate 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());}文件格式<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 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

您一次性将selected属性设置为true,然后以false相同的方法返回。这不会按预期工作。当状态改变时,GUI 直到下一个布局脉冲才会反映改变。但是该true状态不会被下一个布局脉冲看到,因为所述脉冲只会在LightsTest返回后一段时间出现。换句话说,修改节点的状态不会立即更新 GUI。

您使用Thread.sleep. 正在JavaFX 应用程序线程上调用此方法。而停在Thread.sleepJavaFX应用程序线程不能做任何其他工作和GUI将冻结。记住 JavaFX 的黄金法则:永远不要冻结JavaFX 应用程序线程,也不要长时间运行在JavaFX 应用程序线程上。这也适用于许多其他 UI 框架,例如 Swing/AWT 和Event Dispatch Thread


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


查看完整回答
反对 回复 2021-11-03
  • 1 回答
  • 0 关注
  • 215 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信