我是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