Я новичок в JavaFX и хочу создать класс представления, который будет вызывать методы в контроллере, когда событие запускается нажатием кнопки. Мой код ниже:
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());
}
}
Это компилируется, но когда я запускаю его и нажимаю кнопку, я получаю исключение нулевого указателя в лямбда-выражениях. Исключение относится к «menuCtrl». Как мне настроить мою программу, чтобы кнопка вызывала menuCtrl.newGame()?
Вот что я уже пробовал:
- Я переместил команды setOnAction между различными методами.
- Заменены вызовы методов menuCtrl операторами System.out.prinln, чтобы подтвердить, что это работает. Оно делает.
- Я заменил методы menuCtrl на System.out.println(this), чтобы избежать проблем с областью действия. Он печатает «spacetrader.menu.MenuView@74f51979», как и ожидалось.
- Преобразование лямбда-выражений в анонимные внутренние классы.
- Использовал блок в качестве тела лямбды
fx:controller="MenuView"
в качестве атрибута в корневом элементе?) Это была бы необычная установка, по крайней мере, так, как у вас здесь. - person James_D   schedule 03.10.2014