Исключение в методе запуска приложения, вызванное методом инициализации - PullRequest
0 голосов
/ 17 апреля 2019

Это один из моих первых проектов, использующих FXML, и у меня возникают проблемы с моим методом инициализации и загрузкой файла FXML в целом.

Я не уверен, что мне не хватает, но я помогу сПрограмма будет оценена.

Выдержка из класса контроллера:

public class Controller implements Initializable {

    @FXML TextField input;
    @FXML TextArea output;
    @FXML RadioMenuItem chooseLonghand;
    @FXML RadioMenuItem chooseRoman;
    @FXML Button addInput;
    String number;
    Object conversion;
    Alert alert;
    BufferedNumberConverter converter;

    TextInputDialog retry = new TextInputDialog("Enter a valid integer");

    public Controller(){

    }

    @FXML
    public void initialize(URL url, ResourceBundle resourceBundle) {
        final ToggleGroup group = new ToggleGroup();
        chooseLonghand.setToggleGroup(group);
        chooseRoman.setToggleGroup(group);
    }

Класс запуска:

public class Launcher extends Application {
    public static void main(String [] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("GUI.fxml"));
        stage.setScene(new Scene(root));
        stage.setTitle("Number Converter");
        stage.show();

        // Close all windows when primaryStage closed
        stage.setOnCloseRequest(ev -> System.exit(0));

    }
}

FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.RadioButton?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.Pane?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ragog.Controller">
   <children>
      <TextArea layoutY="200.0" prefHeight="200.0" prefWidth="600.0" />
      <Label layoutX="14.0" layoutY="14.0" prefHeight="17.0" prefWidth="91.0" text="Enter a number:" />
      <TextField layoutX="105.0" layoutY="10.0" />
      <Button layoutX="265.0" layoutY="10.0" mnemonicParsing="false" onAction="#addInput" text="Add Input" />
      <RadioButton layoutX="160.0" layoutY="56.0" mnemonicParsing="false" onAction="#chooseLonghand" text="Rewrite in longhand" />
      <RadioButton layoutX="160.0" layoutY="85.0" mnemonicParsing="false" onAction="#chooseRoman" prefHeight="17.0" prefWidth="177.0" text="Rewrite in roman numerals" />
      <Button layoutX="355.0" layoutY="81.0" mnemonicParsing="false" onAction="#rewrite" text="Rewrite!" />
      <Button layoutX="14.0" layoutY="158.0" mnemonicParsing="false" onAction="#output" text="Output:" />
   </children>
</Pane>

1 Ответ

0 голосов
/ 18 апреля 2019

Ни chooseLonghand, ни chooseRoman не имеют соответствующего элемента в файле fxml. Вы используете только onAction обработчики событий с тем же именем для элементов <RadioButton>. (Я не уверен, почему это не приводит к исключению до того, как FXMLLoader даже достигнет точки, где initialize вызывается.)

По этой причине оба поля равны null, когда вызывается метод initialize.

Вам необходимо добавить fx:id s к элементам, которые должны быть введены в контроллер:

<RadioButton fx:id="chooseLonghand" layoutX="160.0" layoutY="56.0" mnemonicParsing="false" onAction="#chooseLonghand" text="Rewrite in longhand" />
<RadioButton fx:id="chooseRoman" layoutX="160.0" layoutY="85.0" mnemonicParsing="false" onAction="#chooseRoman" prefHeight="17.0" prefWidth="177.0" text="Rewrite in roman numerals" />
...