java - 解决 JavaFX FXML 中的 onAction 事件的问题
问题描述
本来应该直截了当的事情已经迅速走下坡路。
到目前为止,我已经在 stackOverflow 上尝试了每一个与 onAction 相关的问题,两次和三次检查是否有任何拼写错误,甚至在 Reddit 的 /r/javahelp 上搜索时都掉到了最低水平,但可惜我已经屈服了。
我和一个朋友正在开发一个网络文本编辑器作为概念证明/宠物项目,虽然我正在努力解决它的网络方面,但我试图通过添加皮肤深层部分来提供帮助,比如这个麻烦的设置画面。我要做的就是给用户一个允许他们更改主题的对话框,然后将其加载到新的 CSS 表中。
我有以下文件: SettingsTools.java
public class SettingsTools {
String ret = null;
Stage stage;
Parent root;
Scene scene;
SettingsController sc = new SettingsController();
public void changeTheme() {
stage = new Stage();
root = ApplicationTools.loadFromFXML("/fxml/settings.fxml", sc);
scene = new Scene(root, 350, 350);
stage.setScene(scene);
stage.setTitle("Settings");
stage.showAndWait();
}
public String showSettings() {
changeTheme();
return sc.getData();
}
}
设置.fxml
<GridPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/10.0.1" >
<columnConstraints>
<ColumnConstraints minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" />
<RowConstraints minHeight="10.0" prefHeight="30.0" />
<RowConstraints minHeight="10.0" prefHeight="30.0" />
</rowConstraints>
<children>
<RadioButton id="light" selected="true" text="Light">
<toggleGroup>
<ToggleGroup fx:id="t" />
</toggleGroup>
</RadioButton>
<RadioButton id="dark" text="Dark" toggleGroup="$t" GridPane.rowIndex="1" />
<Button text="Accept"
GridPane.columnIndex="1"
GridPane.rowIndex="2"
fx:id="accept"
onAction="#acceptButton"/>
<Button text="Cancel"
GridPane.rowIndex="2"
fx:id="cancel"
onAction="#cancelButton"/>
</children>
</GridPane>
设置控制器.java
public class SettingsController {
String ret = null;
Stage stage;
Parent root;
Scene scene;
@FXML
Button accept;
@FXML
Button cancel;
@FXML
RadioButton dark;
@FXML
RadioButton light;
@FXML
protected void acceptButon() {
if (light.isSelected()) {
ret = "light";
} else if (dark.isSelected()) {
ret = "dark";
}
Stage stage = (Stage) accept.getScene().getWindow();
stage.close();
}
@FXML
protected void cancelButton(ActionEvent event) {
ret = null;
stage.close();
}
public String getData() {
return ret;
}
}
ApplicationTools.java(仅供参考)
public static <T> T loadFromFXML(String path, Object controller) {
T root;
// Attempt to load FXML file
try {
FXMLLoader loader = new FXMLLoader();
URL location = ApplicationTools.class.getResource(path);
loader.setLocation(location);
if(controller != null) {
loader.setController(controller);
}
root = loader.load();
} catch (Exception e) {
// FXML file load failed, return error scene instead
System.err.format("Failed loading FXML file at path: '%s':\n" + e.getMessage(), path);
VBox t_root = new VBox();
t_root.getChildren().add(new Label("Failed loading FXML file at path: '" + path + "':\n" + e.getMessage()));
root = (T) t_root;
}
return root;
}
当用户选择他们希望查看设置屏幕时,会创建一个新的 SettingsTools 实例,然后在其上调用 showSettings()。我目前试图实现的全部目的是根据选择的选项返回一个字符串。我知道不需要呼叫更改主题的整个呼叫显示设置,但这样做是为了在需要更多设置时限制未来的更改。
出于某种原因,FXML/JavaFX 不允许 onAction="acceptButton",但所有谷歌答案都是关于拼写错误等。
解决方案
推荐阅读
- powershell - powershell Try/Catch/Final 脚本的最佳实践?
- go - Golang在处理错误返回时删除重复代码
- r - 如何在我的 if 语句的输出中添加两位精度
- angular - 打字稿联合类型错误
- angular - 如何使用带角度的 Ionic4 查找 IMEI 号码
- python - 图形和呈现数据
- javascript - Javascript 的最大字符串长度(要复制到 HTML 元素中的文本)[Javascript,HTML]
- pandas - 如何运行多个 agg 函数并将它们作为 pandas 数据框中的行返回?
- r - 我想知道如何将 URL 添加到 ics
- python - 熊猫错误地转换日期