2014-04-24 2 views
0

Вот простой проект label для javafx, использующий fxml с netbeans. Проблема заключается в том, когда я используюjava.lang.reflect.InvocationTargetException, когда я пытаюсь изменить текстовое значение метки

StartFomulars.setText("abc"); 

Он просто получает исключение приведенную ниже.

Вот код для главной,

package main; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 


public class Start extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Prove Controller = new Prove(); 
     Controller.launchController(stage); 
    } 

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

} 

FXML,

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

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

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="720.0" prefWidth="1080.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2"> 
    <children> 
    <GridPane layoutX="0.0" layoutY="0.0" prefHeight="720.0" prefWidth="1080.0"> 
     <children> 
     <GridPane GridPane.columnIndex="0" GridPane.rowIndex="0"> 
      <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 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> 
      <rowConstraints> 
      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
      </rowConstraints> 
     </GridPane> 
     <GridPane GridPane.columnIndex="1" GridPane.rowIndex="1"> 
      <children> 
      <GridPane GridPane.columnIndex="0" GridPane.rowIndex="0"> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       </columnConstraints> 
       <rowConstraints> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       </rowConstraints> 
      </GridPane> 
      </children> 
      <columnConstraints> 
      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
      </columnConstraints> 
      <rowConstraints> 
      <RowConstraints maxHeight="282.0" minHeight="10.0" prefHeight="282.0" vgrow="SOMETIMES" /> 
      <RowConstraints maxHeight="281.0" minHeight="10.0" prefHeight="281.0" vgrow="SOMETIMES" /> 
      </rowConstraints> 
     </GridPane> 
     <GridPane GridPane.columnIndex="0" GridPane.rowIndex="1"> 
      <children> 
      <Label text="Given: " GridPane.columnIndex="0" GridPane.rowIndex="0" /> 
      <Label text="Prove: " GridPane.columnIndex="0" GridPane.rowIndex="1" /> 
      <Label text="Goal: " GridPane.columnIndex="0" GridPane.rowIndex="2" /> 
      <Label fx:id="StartFomulars" text="StartFomulars" GridPane.columnIndex="1" GridPane.rowIndex="0" /> 
      <Label fx:id="GoalFomular" text="GoalFomular" GridPane.columnIndex="1" GridPane.rowIndex="2" /> 
      </children> 
      <columnConstraints> 
      <ColumnConstraints hgrow="SOMETIMES" maxWidth="457.0" minWidth="10.0" prefWidth="125.0" /> 
      <ColumnConstraints hgrow="SOMETIMES" maxWidth="802.0" minWidth="10.0" prefWidth="790.0" /> 
      </columnConstraints> 
      <rowConstraints> 
      <RowConstraints maxHeight="188.0" minHeight="10.0" prefHeight="156.0" vgrow="SOMETIMES" /> 
      <RowConstraints maxHeight="364.0" minHeight="10.0" prefHeight="364.0" vgrow="SOMETIMES" /> 
      <RowConstraints maxHeight="186.0" minHeight="10.0" prefHeight="43.0" vgrow="SOMETIMES" /> 
      </rowConstraints> 
     </GridPane> 
     </children> 
     <columnConstraints> 
     <ColumnConstraints hgrow="SOMETIMES" maxWidth="915.0" minWidth="10.0" prefWidth="915.0" /> 
     <ColumnConstraints hgrow="SOMETIMES" maxWidth="539.0" minWidth="10.0" prefWidth="165.0" /> 
     </columnConstraints> 
     <rowConstraints> 
     <RowConstraints maxHeight="359.0" minHeight="10.0" prefHeight="157.0" vgrow="SOMETIMES" /> 
     <RowConstraints maxHeight="582.0" minHeight="10.0" prefHeight="563.0" vgrow="SOMETIMES" /> 
     </rowConstraints> 
    </GridPane> 
    </children> 
</AnchorPane> 

Вот код для контроллера,

package main; 

import ast.LogicStatement; 
import java.io.IOException; 
import java.util.List; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.stage.Stage; 

/** 
* 
* @author zl2511 
*/ 
public class Prove { 

    private Parent parent; 
    private Scene scene; 
    private Stage stage; 
    private List<LogicStatement> startStatements; 
    private LogicStatement goalStatement; 

    @FXML 
    private Label StartFomulars, GoalFomular; 

    public Prove() throws IOException { 

     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Prove.fxml")); 
     //fxmlLoader.setController(this); 
     try { 
      parent = (Parent) fxmlLoader.load(); 

      scene = new Scene(parent); 
     } catch (IOException e) { 
     } 

     StartFomulars.setText("abc"); 

    } 


    public void launchController(Stage stage) { 

     this.stage = stage; 
     stage.setTitle("start"); 
     stage.setScene(scene); 
     stage.setResizable(true); 
     stage.hide(); 
     stage.show(); 

    } 

    public void redirectprove(Stage stage, List<LogicStatement> startFormulas, LogicStatement goalFormula) { 

     this.startStatements = startFormulas; 
     this.goalStatement = goalFormula; 

     stage.setScene(scene); 
     stage.hide(); 
     stage.show(); 

    } 
} 

Вот исключение,

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367) 
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:894) 
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56) 
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.NullPointerException 

ответ

3

Ваша структура довольно необычна. Более нормально структурировать класс приложения, файл FXML и контроллер, как показано на рисунке tutorial.

Как вы все настроите, нет никакой связи между вашим классом контроллера и FXML. Поэтому поля, аннотированные @FXML, никогда не инициализируются.

Способ, которым это предназначено работать, заключается в том, что метод FXMLLoaderload(...) будет анализировать файл FXML. Если на загрузчике установлен контроллер, тогда любые элементы с установленным атрибутом fx:id будут вставляться в соответствующие аннотированные поля @FXML в контроллере.

В основном есть два способа установки контроллера на FXMLLoader. Первый - иметь атрибут fx:controller, определенный в корневом элементе файла FXML. Это заставит загрузчик FXML создать новый экземпляр указанного класса и использовать его в качестве своего контроллера. Обратите внимание, что это не будет работать в вашем случае, потому что вы хотите, чтобы контроллер был созданным вами экземпляром Prove, а не новым экземпляром класса Prove.

Второй способ заключается в создании FXMLLoader экземпляр (вместо того, чтобы полагаться на метод staticFXMLLoader.load(URL) вы используете), и вызвать setController(...) этого экземпляра. Так что (я думаю) раскопки

//fxmlLoader.setController(this); 

линия заставит это работать.

Вам может понадобиться, чтобы отделить объявления полей тоже, то есть:

@FXML 
private Label StartFomulars ; 
@FXML 
private Label GoalFomular; 

(. Он может работать без этого изменения, я никогда не пробовал так, как вы его)

Вероятно, вы также должны вынуть структуру try {...} catch (...) {...} в конструкторе для Prove (так как вы объявляете его throws IOException) или, по крайней мере, что-то делают в блоке catch. Прямо сейчас, если возникает исключение при загрузке FXML, вы не узнаете об этом, и вы просто будете пахать вперед и попытаться установить текст метки.

Смежные вопросы