2016-11-30 63 views
0

我使用JavaFX場景生成器創建了一個UI外觀,我可以使用它的控制器,當我單擊它在控制檯上打印的按鈕時。在java中使用FXML控制器調用其他方法?

我的問題是我如何從java程序中調用其他函數。 當我在控制器中創建一個新對象來調用其他方法時,我收到錯誤。

這是一類我想與互動:

public class GOcommand extends Command { 

    public GOcommand(String firstWord, String secondWord, String thirdWord) { 
     super(firstWord, secondWord, thirdWord); 
    } 

    public GOcommand() {} 

    @Override 
    public boolean execute(Player player) { 
     if (!hasSecondWord()) { 
      // if there is no second word, we don't know where to go... 
      Game.out.println(Game.messages.getString("goWhere")); 
      return false; 
     } 

     String direction = getSecondWord(); 
     player.goRoom(direction); 
     return false; 
    } 
    } 

Here is the controller class: 

    public class FXMLDocumentController implements Initializable { 

    Player player; 

    @FXML 
    private TextArea textArea; 

    @FXML 
    private Button northBtn; 

    @FXML 
    private Button giveBtn; 

    @FXML 
    private Button CloseBtn; 

    @FXML 
    private Button eastBtn; 

    @FXML 
    private Button dropBtn; 

    @FXML 
    private Button southBtn; 

    @FXML 
    private Button WestBtn; 

    @FXML 
    private Button helpBtn; 

    @FXML 
    private Button takeBtn; 

    @FXML 
    private void exitGame() { 
     System.exit(1); 
    } 

    @FXML 
    void northClicked(ActionEvent event) { 
     textArea.appendText("Go North button Clicked\n"); 
     player.goRoom("NORTH"); 
    } 

    @FXML 
    private void eastClicked(ActionEvent event) { 
     textArea.appendText("Go East button Clicked\n"); 
    } 

    @FXML 
    private void southClicked(ActionEvent event) { 
     textArea.appendText("Go South button Clicked\n"); 
    } 

    @FXML 
    private void westClicked(ActionEvent event) { 
     textArea.appendText("Go West button Clicked\n"); 
    } 

    @FXML 
    private void dropClicked(ActionEvent event) { 

    } 

    @FXML 
    private void takeClicked(ActionEvent event) { 
     textArea.appendText("Take button Clicked\n"); 
    } 

    @FXML 
    private void giveClicked(ActionEvent event) { 
     textArea.appendText("Give button Clicked\n"); 
    } 

    @FXML 
    private void helpClicked(ActionEvent event) { 
     textArea.appendText("Help me know!\n"); 
    } 


    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 
    } 

而且這些都是錯誤的,因爲我創造了球員:

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:49) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Node.fireEvent(Node.java:8411) 
    at javafx.scene.control.Button.fire(Button.java:185) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
    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$MouseHandler.process(Scene.java:3757) 
    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:380) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
    at com.sun.glass.ui.View.notifyMouse(View.java:937) 
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:498) 
    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:498) 
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769) 
    ... 45 more 
Caused by: java.lang.NullPointerException 
    at assignment2.FXMLDocumentController.northClicked(FXMLDocumentController.java:62) 
    ... 55 more 
+3

如果您嘗試調用「其他方法」,會得到什麼錯誤?你可以發佈你試圖調用這些其他方法嗎?(例如,請發佈你的控制器類) – n247s

回答

0

在您發佈的堆棧跟蹤的底部,它顯示了一個NPE,你正在接觸的球員'球員'。而從我所看到的情況來看,這個領域並沒有啓動。否則,這個代碼將工作得很好。

+0

我在開始時創建了它「播放器播放器;」在控制器@ n247s – Pavlos

+0

中,這是播放器類中代碼的一部分: public Player(String name,Room room){this.name = name; currentRoom = room; items = new HashMap <>(); } – Pavlos

+1

您創建了該字段,但未初始化該字段。 (例如'Player player = new Player();' – n247s

0

您需要創建一個播放器像一個新的實例:在JavaFX應用程序

Player player = new Player(); 

一個的InvocationTargetException往往是通過訪問是空字段造成的。請記住,創建JavaFX應用程序時!

+0

問題是,玩家經歷一場比賽,他有名稱和房間參數,我怎麼也傳遞這些參數? – Pavlos

相關問題