Athelionas
Athelionas

Reputation: 181

JavaFX 2.2 InvocationTargetException issue

I'm writing a small application (a simple calculatar) for demonstration purposes and I have a little problem in the class below. Whenever I try to run the application I get an InvocationTargetException caused by the buttons in initialize(). Calling any of the methods of a button reproduces the issue.

Any help is highly appreciated.

package ui;

import java.io.IOException;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;

public class CalculatorController extends GridPane {

    @FXML
    private TextArea displayArea;

    @FXML
    private Button mcButton, mrButton, msButton, mPlusButton, mMinusButton,
            deleteButton, clearEverythingButton, clearButton, negateButton,
            sqrtButton, sevenButton, eightButton, nineButton, divideButton,
            percentButton, fourButton, fiveButton, sixButton, multiplyButton,
            reciprocButton, oneButton, twoButton, threeButton, minusButton,
            resultButton, zeroButton, fractionButton, plusButton;

    @SuppressWarnings("LeakingThisInConstructor")
    public CalculatorController() {
        final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Calculator.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);
        try {
            fxmlLoader.load();
        } catch (IOException e) {
            System.out.println(e);
            Platform.exit();
        }
    }

    @FXML
    private void initialize() {
        // do something with the buttons here to reproduce exception
        // e.g. call any of their methods
    }

}

My main class:

package main;

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import ui.CalculatorController;

public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("Calculator");
        Parent root = new CalculatorController();
        stage.setScene(new Scene(root, 217, 306));
        stage.setResizable(false);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

And finally the fxml:

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

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<fx:root type="javafx.scene.layout.GridPane" alignment="CENTER" hgap="2.0" prefHeight="306.0" prefWidth="217.0" vgap="2.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
  <children>
    <Button fx:id="mcButtton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="MC" textAlignment="CENTER" GridPane.columnIndex="0" GridPane.rowIndex="2" />
    <Button fx:id="mrButtton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="MR" textAlignment="CENTER" GridPane.columnIndex="1" GridPane.rowIndex="2" />
    <Button fx:id="msButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="MS" textAlignment="CENTER" GridPane.columnIndex="2" GridPane.rowIndex="2" />
    <Button fx:id="mPlusButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="M+" textAlignment="CENTER" GridPane.columnIndex="3" GridPane.rowIndex="2" />
    <Button fx:id="mMinusButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="M-" textAlignment="CENTER" GridPane.columnIndex="4" GridPane.rowIndex="2" />
    <Button fx:id="deleteButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="⬅" textAlignment="CENTER" GridPane.columnIndex="0" GridPane.rowIndex="3">
      <font>
        <Font size="14.0" />
      </font>
    </Button>
    <Button fx:id="clearEverythingButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="CE" textAlignment="CENTER" GridPane.columnIndex="1" GridPane.rowIndex="3" />
    <Button fx:id="clearButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="C" textAlignment="CENTER" GridPane.columnIndex="2" GridPane.rowIndex="3" />
    <Button fx:id="negateButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="±" textAlignment="CENTER" GridPane.columnIndex="3" GridPane.rowIndex="3" />
    <Button fx:id="sqrtButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="√" textAlignment="CENTER" GridPane.columnIndex="4" GridPane.rowIndex="3" />
    <Button fx:id="sevenButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="7" textAlignment="CENTER" GridPane.columnIndex="0" GridPane.rowIndex="4" />
    <Button fx:id="eightButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="8" textAlignment="CENTER" GridPane.columnIndex="1" GridPane.rowIndex="4" />
    <Button fx:id="nineButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="9" textAlignment="CENTER" GridPane.columnIndex="2" GridPane.rowIndex="4" />
    <Button fx:id="divideButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="/" textAlignment="CENTER" GridPane.columnIndex="3" GridPane.rowIndex="4" />
    <Button fx:id="percentButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="\%" textAlignment="CENTER" GridPane.columnIndex="4" GridPane.rowIndex="4" />
    <Button fx:id="fourButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="4" textAlignment="CENTER" GridPane.columnIndex="0" GridPane.rowIndex="5" />
    <Button fx:id="fiveButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="5" textAlignment="CENTER" GridPane.columnIndex="1" GridPane.rowIndex="5" />
    <Button fx:id="sixButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="6" textAlignment="CENTER" GridPane.columnIndex="2" GridPane.rowIndex="5" />
    <Button fx:id="multiplyButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="*" textAlignment="CENTER" GridPane.columnIndex="3" GridPane.rowIndex="5" />
    <Button fx:id="reciprocButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="1/x" textAlignment="CENTER" GridPane.columnIndex="4" GridPane.rowIndex="5" />
    <Button fx:id="oneButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="1" textAlignment="CENTER" GridPane.columnIndex="0" GridPane.rowIndex="6" />
    <Button fx:id="twoButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="2" textAlignment="CENTER" GridPane.columnIndex="1" GridPane.rowIndex="6" />
    <Button fx:id="threeButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="3" textAlignment="CENTER" GridPane.columnIndex="2" GridPane.rowIndex="6" />
    <Button fx:id="minusButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="-" textAlignment="CENTER" GridPane.columnIndex="3" GridPane.rowIndex="6" />
    <Button fx:id="zeroButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="0" textAlignment="CENTER" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="7" />
    <Button fx:id="fractionButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="," textAlignment="CENTER" GridPane.columnIndex="2" GridPane.rowIndex="7" />
    <Button fx:id="plusButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="+" textAlignment="CENTER" GridPane.columnIndex="3" GridPane.rowIndex="7" />
    <Button fx:id="resultButton" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="=" textAlignment="CENTER" GridPane.columnIndex="4" GridPane.rowIndex="6" GridPane.rowSpan="2" />
    <TextArea fx:id="displayArea" prefWidth="200.0" wrapText="true" GridPane.columnIndex="0" GridPane.columnSpan="2147483647" GridPane.rowIndex="0" GridPane.rowSpan="2">
      <GridPane.margin>
        <Insets bottom="5.0" />
      </GridPane.margin>
    </TextArea>
  </children>
  <columnConstraints>
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
  </columnConstraints>
  <padding>
    <Insets left="5.0" right="5.0" />
  </padding>
  <rowConstraints>
    <RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    <RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
  </rowConstraints>
</fx:root>

UPDATE:

So, I finally found what the problem was. I had two of my buttons' fx:id mistyped in the FXML.

Upvotes: 0

Views: 172

Answers (1)

Nikos Paraskevopoulos
Nikos Paraskevopoulos

Reputation: 40318

Some buttons are null in initialize() because there is no element with the corresponding fx:id in the FXML.

In order to have this injected:

@FXML private Button mcButton;

There must be a <Button> with the corresponding fx:id:

<Button fx:id="mcButton" ... />

Calling e.g. msButton.setText("XX"); (msButton exists in the FXML) works.

Upvotes: 2

Related Questions