我是JavaFX的新手,我想创建一个视图类,当通过按钮触发事件时,该类将调用Controller中的方法。我的代码如下:在Java Fx ActionEvent中调用方法
package spacetrader.menu;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import spacetrader.Window;
public class MenuView implements Initializable {
public Window window;
public MenuCtrl menuCtrl;
@FXML
Button start;
@FXML
Pane background;
@FXML
Button exit;
public MenuView() {};
public MenuView(Window aWindow, MenuCtrl aMenuCtrl) {
window = aWindow;
menuCtrl = aMenuCtrl;
}
void renderMainMenu() {
try {
window.loadFXML(new FXMLLoader((getClass().getResource("MainMenu.fxml"))));
} catch (IOException ex) {
Logger.getLogger(MenuView.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void initialize(URL url, ResourceBundle rb) {
start.setOnAction((ActionEvent event) -> menuCtrl.newGame());
exit.setOnAction((ActionEvent event) -> menuCtrl.closeApplication());
}
}
这编译,但是当我运行它,然后按下按钮我在lambda表达式上得到一个空指针异常。异常指的是“menuCtrl”。我应该如何设置我的程序,使按钮调用menuCtrl.newGame()?
这是我已经尝试过:
- 我搬到了setOnAction命令,各种方法之间。
- 用System.out.prinln语句替换了对menuCtrl方法的调用,以确认这是有效的。它的确如此。
- 我已经用System.out.println(this)替换了menuCtrl方法,以确保没有范围问题。按预期打印“[email protected]”。
- 转换的Lambda表达式来使用的块作为拉姆达的身体匿名内部类
这是类加载相同FXML控制器类? (即MainMenu.fxml是否具有'fx:controller =“MenuView”'作为根元素中的一个属性?)这将是一个不寻常的设置,至少在这里是这样。 – 2014-10-03 12:10:40
是的MainMenu.fxml中的fx:控制器是MenuView。为什么这很奇怪? – jaxoncreed 2014-10-03 16:40:42
因为您必须创建控制器的一个实例才能加载FXML,然后创建另一个控制器实例。通常情况下,您可以从不同的类加载FXML(如果您使用的是[动态根目录],则可能是异常(http://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files /introduction_to_fxml.html#custom_components)(看起来很不一样) – 2014-10-03 17:47:46