The*_*ude 14 java nullpointerexception javafx-8
我刚开始使用JavaFX Scene Builder来构建一个小应用程序.
它由一个属于'login.fxml'的控制器类'Login.java'组成,其中FXML文件'registrierung.fxml'通过一个名为'registrationClicked(ActionEvent event)'的方法加载:
public class Login {
@FXML
private void registrationClicked(ActionEvent event){
try{
((Node) (event.getSource())).getScene().getWindow().hide();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/fxml/registrierung.fxml"));
Parent root = (Parent) loader.load();
Stage stage = new Stage();
Scene scene = new Scene(root);
stage.setTitle("Registration");
stage.setScene(scene);
stage.setResizable(false);
stage.show();
} catch(IOException e){
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想通过根节点vboxRoot在控制器类'Registrierung.java'中引用'registrierung.fxml'的阶段:
@FXML
private VBox vboxRoot;
Stage stage = (Stage) vboxRoot.getScene().getWindow();
Run Code Online (Sandbox Code Playgroud)
但是'getScene()'总是会导致NullPointerException.在Scene Builder中调整两个FXML文件的控制器类.
这就是我在'registrierung.fxml'中设置rood节点的方法:
<VBox fx:id="vboxRoot" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="267.0" prefWidth="355.0" stylesheets="@../css/styles.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="businesslogik.Registrierung">
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
小智 10
您正在尝试获取尚未初始化的对象的场景.如果你在做同样的操作
@Override
public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
Stage stage = (Stage) vboxRoot.getScene().getWindow();
}
Run Code Online (Sandbox Code Playgroud)
或者如果你有一个事件在你点击某个东西后触发(在场景加载后执行)
@FXML
private void action(ActionEvent event) throws IOException {
Stage stage = (Stage) vboxRoot.getScene().getWindow();
}
Run Code Online (Sandbox Code Playgroud)
这会奏效!
我遇到过这个问题并通过调用这样的方法找到了(当场景变得可见并附加到节点时,这将触发):
private void determinePrimaryStage() {
rootPane.sceneProperty().addListener((observableScene, oldScene, newScene) -> {
if (oldScene == null && newScene != null) {
// scene is set for the first time. Now its the time to listen stage changes.
newScene.windowProperty().addListener((observableWindow, oldWindow, newWindow) -> {
if (oldWindow == null && newWindow != null) {
primaryStage = (Stage)newWindow;
}
});
}
});
}`
Run Code Online (Sandbox Code Playgroud)
然后我可以在以后做这样的事情:
if(primaryStage == null) {
Platform.runLater(()-.{......
}else {
//do whatever
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
12933 次 |
| 最近记录: |