Проблемы, разрешающие событие onAction в JavaFX FXML

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

До сих пор я пробовал все вопросы, связанные с onAction, по stackOverflow, дважды и трижды проверял на наличие опечаток и даже упал до уровня поиска на 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();
    }
}

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 касаются опечаток и т. д.

У вас опечатка: protected void acceptButon () -> acceptButton ()

Rcordoval 18.11.2018 02:42

У вас когда-нибудь был один из тех дней, когда, как бы вы ни старались, вы всегда попадаете в ситуацию, когда вам просто нужно «ну почему я такой чертов дурак»? Да, я тоже

Setho246 18.11.2018 03:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
62
0

Другие вопросы по теме