Проблемы, устраняющие событие onAction в JavaFX FXML - PullRequest
0 голосов
/ 18 ноября 2018

То, что должно было быть прямым, быстро пошло вниз.

До сих пор я пробовал все связанные с onAction вопросы о stackOverflow, дважды и трижды проверял их на наличие опечаток, и даже упал до уровня поиска в / r / javahelp от Reddit, но, увы, я уступил.

Мы с другом работаем над сетевым текстовым редактором в качестве доказательства концепции / проекта для домашних животных, и, хотя я изо всех сил пытаюсь обернуть его вокруг сетевой стороны, я пытаюсь помочь, добавив скин -глубокие разделы, такие как этот хлопотный экран настроек. Все, что я хочу сделать, это дать пользователю диалоговое окно, позволяющее ему сменить тему, которое затем загрузится в новый лист 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();
    }
}

settings.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>

SettingsController.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", но все ответы Google относятся к опечаткам и т. Д.

...