首页 > 解决方案 > 解决 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",但所有谷歌答案都是关于拼写错误等。

标签: javauser-interfacejavafxfxml

解决方案


推荐阅读