2016-11-30 54 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

相关问题