2016-05-09 4 views
0

Я использую SceneBuilder для создания графического интерфейса для получения информации от пользователя с помощью текстовых фейдов. Я получаю это InvocationTargetException и трассировку стека, когда я нажимаю кнопку calcPremiumButton.InvocationTargetException и NullPointerException JavaFX

> Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470) 
    at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3766) 
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$355(GlassViewEventHandler.java:388) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
    at com.sun.glass.ui.View.notifyMouse(View.java:937) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: 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:497) 
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771) 
    ... 31 more 
Caused by: java.lang.NullPointerException 
    at PremiumCalculator.calculatePremiumAction(PremiumCalculator.java:52) 
    ... 41 more 

Я прослежена NullPointerException назад к методу setOnMouseClicked.

import java.lang.*; 
    import java.util.*; 
    import java.awt.*; 
    import javafx.event.Event; 
    import javafx.event.EventHandler; 
    import javafx.scene.input.MouseEvent; 
    import javafx.fxml.FXML; 
    import javafx.scene.control.Button; 
    import javafx.scene.control.Label; 
    import javafx.scene.control.TextField; 

    /*** PremiumCalculator ***/ 
    public class PremiumCalculator extends LifeInsurancePolicy 
    { 
     @FXML 
     private static TextField coverage; 

     @FXML 
     private static TextField number; 

     @FXML 
     private static TextField lName; 

     @FXML 
     private static TextField a; 

     @FXML 
     private static TextField fName; 

     @FXML 
     private static TextField s; 

     @FXML 
     private static TextField pName; 

     @FXML 
     private static Label outputLabel; 

     @FXML 
     private static Button calcPremiumButton; 

     @FXML 
     private static TextField w; 

     @FXML 
     private static TextField h; 

     @FXML 
     private void calculatePremiumAction() 
     { 
      /*** setOnMouseClicked ***/  
      PremiumCalculator.calcPremiumButton.setOnMouseClicked(new EventHandler<MouseEvent>() 
      { 
      /*** handle ***/ 
      public void handle(MouseEvent mouseEvent) 
      { 
       /*** Get information from the GUI text boxes ***/ 
       String number = PremiumCalculator.number.getText(); 
       String pName = PremiumCalculator.pName.getText(); 
       String fName = PremiumCalculator.fName.getText(); 
       String lName = PremiumCalculator.lName.getText(); 
       String a = PremiumCalculator.a.getText(); 
       String s = PremiumCalculator.s.getText(); 
       String h = PremiumCalculator.h.getText(); 
       String w = PremiumCalculator.w.getText(); 
       String coverage = PremiumCalculator.coverage.getText(); 

       /*** Convert Strings ***/ 
       int num = Integer.parseInt(number); 
       int ag = Integer.parseInt(a); 
       double he = Double.parseDouble(h); 
       double we = Double.parseDouble(w); 
       double c = Double.parseDouble(coverage); 
       double lifeInsurance = Double.parseDouble(lifeInsurancePolicyString); 

       /*** Instantiate a new LifeInsurancePolicy object ***/ 
       LifeInsurancePolicy customer = new LifeInsurancePolicy(num, pName, fName, lName, ag, s, he, we); 

       /*** Call an instance of the LifeInsurancePolicy object to get the life insurance cost ***/ 
       double lifeInsuranceAmount = customer.calculateLifeInsurance(s, bmi); 

       /*** Display the life insurance cost ***/ 
       outputLabel.setText("Life Insurance Cost: " + lifeInsuranceAmount); 
      } 
      /*** End handle ***/ 
      }); 
      /*** End setOnMouseClicked ***/   
     }     
    } 
    /*** End PremiumCalculator ***/ 

Я не уверен, если я получаю исключение из метода setOnMouseClicked или если это вызвано чем-то другим. Любая помощь приветствуется!

+0

Почему 'import java.awt. *;'? Вы не должны делать этого в классе, который используется с javafx. * Если * вам нужны классы из 'java.awt', импортируйте их по одному. – fabian

+0

@fabian Я использовал что-то еще и не забрал оператор импорта –

ответ

1

SceneBuilder позволяет кому-то редактировать файлы FXML. Эти файлы описывают представление, интерфейс, точно так же, как HTML-файл будет делать это для веб-страницы.

Проблема в том, что вы пытаетесь поставить событие на свою кнопку внутри функции private void calculatePremiumAction(). Но эта функция уже является функцией Event (потому что она имеет @FXML поверх нее), вам просто нужно связать ее с вашей кнопкой в ​​SceneBuilder.

Here пример того, как вы должны это делать.

+0

Я уже привязал его с помощью кнопки в SceneBuilder –

+1

Тогда вы должны просто написать код, который вы хотите сделать, в функции 'calculatePremiumAction()' BUT вам нужно избавиться от 'setOnMouseClicked' и части обработки событий в коде. Сохраняйте только то, что находится внутри функции 'handle()'. –

+0

Я попробую, чтобы посмотреть, работает ли это –

1

Сначала сделайте свою жизнь проще с помощью SceneBuilder. Он создаст FXML для вас.

Во-вторых, используйте поле «On Action» SceneBuilder в разделе кода, чтобы назвать способ обработки кнопки в контроллере напрямую без неуклюже. setOnMouseClicked() вызов с анонимным классом в качестве параметра. Это должно выглядеть в FXML:

<Button onAction="#onBtnClicked" text="Text on button" /> 

В контроллере:

@FXML 
void onBtnClicked(ActionEvent event) { 
    // your handling code goes here 
} 

Тогда FXMLLoader может быть использован для загрузки вашего JavaFX Node от * .fxml и вводить все @FXML аннотированные поля в экземпляр ваш контроллер пользовательского интерфейса.

URL fxmlLocation = new URL("url to your fxml"); 
FXMLLoader loader = new FXMLLoader(fxmlLocation); 
PremiumCalculator controller = new PremiumCalculator(); 
loader.setController(controller); 
// now load and inject 
Node javafxNode = loader.load(); 

Добавить javafxNode к сцене, чтобы сделать его частью видимого графа сцены. Это должно сделать трюк. Кроме того, ваш код в контроллере будет проще и понятнее.