切换按钮 .isSelected() 为真,但在 JavaFX 中视觉上没有变化
Toggle button .isSelected() is true, but visually not changing in JavaFX
我正在尝试使用切换按钮制作指示灯。当 "Selected" 值为真时,它将 "illuminate"。而不是 "illuminate" 当它的 "Selected" 值为 false 时。我添加了常规按钮只是为了测试切换按钮上视觉效果的格式。在实际程序中,"lights" 将在其他方法中进行控制。
问题是当我设置 toggleBtn.setSelected(true);它不会更新视觉效果。如果我调用 toggleBtn.isSelected();它 returns 是的,所以我知道它正在更新,而不是视觉。如果我在单击 "Test" 按钮之前通过在程序中单击它来 "pre-select" 切换按钮,它将循环到关闭视觉效果。但它不会循环回到 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());
}
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);
}
谢谢大家!
您正在将 selected
属性 设置为 true
,然后以相同的方法一次性设置回 false
。这不会按预期工作。当状态改变时,GUI 直到下一个布局脉冲才会反映这些变化。但是下一个布局脉冲不会看到 true
状态,因为所述脉冲只会在 LightsTest
returns 之后的某个时间出现。换句话说,修改节点的状态不会立即更新GUI.
您使用 Thread.sleep
导致了一个辅助问题。此方法正在 JavaFX 应用程序线程 上调用。当停在 Thread.sleep
时,JavaFX 应用程序线程 不能做任何其他工作,GUI 将冻结。记住 JavaFX 的黄金法则:永远不要冻结,也不要长期 运行 工作,JavaFX 应用程序线程。这也适用于许多其他 UI 框架,例如 Swing/AWT 和 Event Dispatch Thread.
无关:遵循正确的 Java 命名约定,您的方法应称为 lightsTest
,而不是 LightsTest
。
我正在尝试使用切换按钮制作指示灯。当 "Selected" 值为真时,它将 "illuminate"。而不是 "illuminate" 当它的 "Selected" 值为 false 时。我添加了常规按钮只是为了测试切换按钮上视觉效果的格式。在实际程序中,"lights" 将在其他方法中进行控制。
问题是当我设置 toggleBtn.setSelected(true);它不会更新视觉效果。如果我调用 toggleBtn.isSelected();它 returns 是的,所以我知道它正在更新,而不是视觉。如果我在单击 "Test" 按钮之前通过在程序中单击它来 "pre-select" 切换按钮,它将循环到关闭视觉效果。但它不会循环回到 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());
}
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);
}
谢谢大家!
您正在将 selected
属性 设置为 true
,然后以相同的方法一次性设置回 false
。这不会按预期工作。当状态改变时,GUI 直到下一个布局脉冲才会反映这些变化。但是下一个布局脉冲不会看到 true
状态,因为所述脉冲只会在 LightsTest
returns 之后的某个时间出现。换句话说,修改节点的状态不会立即更新GUI.
您使用 Thread.sleep
导致了一个辅助问题。此方法正在 JavaFX 应用程序线程 上调用。当停在 Thread.sleep
时,JavaFX 应用程序线程 不能做任何其他工作,GUI 将冻结。记住 JavaFX 的黄金法则:永远不要冻结,也不要长期 运行 工作,JavaFX 应用程序线程。这也适用于许多其他 UI 框架,例如 Swing/AWT 和 Event Dispatch Thread.
无关:遵循正确的 Java 命名约定,您的方法应称为 lightsTest
,而不是 LightsTest
。