JavaFX FXML场景切换不工作[NullPointerException]
我试图在按下按钮时切换布局。我尝试了很多东西,也在stackoverflow上搜索了这里,但给出的答案似乎不适合我 My FrontendView.class:JavaFX FXML场景切换不工作[NullPointerException],java,javafx,nullpointerexception,fxml,Java,Javafx,Nullpointerexception,Fxml,我试图在按下按钮时切换布局。我尝试了很多东西,也在stackoverflow上搜索了这里,但给出的答案似乎不适合我 My FrontendView.class: /* FrontendView Class by @Aebian */ package org.aebian.umFrontend.view; import javafx.application.Application; import javafx.event.EventHandler; import javafx.fxml.FXML
/* FrontendView Class by @Aebian */
package org.aebian.umFrontend.view;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.io.IOException;
public class FrontendView extends Application {
@FXML
protected static Button btnLogin, btnSave, btnDiscard, btnRefresh, btnEdit;
@FXML
private Stage primaryStage;
@FXML
private Scene scene;
@FXML
private VBox vDefault;
@FXML
protected BorderPane rootLayout;
private double xOffset = 0;
private double yOffset = 0;
@Override
public void start(Stage primaryStage) {
GridPane root = new GridPane();
primaryStage.setMinWidth(800);
primaryStage.initStyle(StageStyle.UNDECORATED);
primaryStage.setMinHeight(600);
primaryStage.setResizable(false);
primaryStage.getIcons().add(new Image("file:res/images/uMgmt.png"));
primaryStage.setTitle("User Management");
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
this.primaryStage = primaryStage;
root.setAlignment(Pos.CENTER);
showRoot();
showLogin();
}
public void showRoot() { // Load root layout
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(FrontendView.class.getResource("UI/umFrontendRoot.fxml"));
rootLayout = loader.load();
rootLayout.setId("umFrontend");
//Let the root Layout be able to moved around.
rootLayout.getTop().setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
xOffset = event.getSceneX();
yOffset = event.getSceneY();
}
});
rootLayout.getTop().setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
primaryStage.setX(event.getScreenX() - xOffset);
primaryStage.setY(event.getScreenY() - yOffset);
}
});
// Show the scene containing the root layout.
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
String css = FrontendView.class.getResource("UI/umFrontendStyles.css").toExternalForm();
scene.getStylesheets().clear();
scene.getStylesheets().add(css);
primaryStage.show();
} catch (IOException e) {
}
}
public void showLogin() { // Load the login page.
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(FrontendView.class.getResource("UI/umFrontendLogin.fxml"));
vDefault = loader.load();
// Set login to center of root layout.
rootLayout.setCenter(vDefault);
} catch (IOException e) {
}
}
public void showAbout() { // Load the about page.
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(FrontendView.class.getResource("UI/umFrontendAbout.fxml"));
vDefault = loader.load();
// Set about page to center of root layout.
this.rootLayout.setCenter(vDefault);
} catch (IOException e) {
}
}
public void showAdminOverview() { // Load the admin overview / edit page.
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(FrontendView.class.getResource("UI/umFrontendAdminOverview.fxml"));
VBox showAdminOverview = loader.load();
// Set admin overview page to center of root layout.
rootLayout.setCenter(showAdminOverview);
} catch (IOException e) {
}
}
public void showUserOverview() { // Load the user overview / edit page.
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(FrontendView.class.getResource("UI/umFrontendUserOverview.fxml"));
VBox showUserOverview = loader.load();
// Set admin overview page to center of root layout.
rootLayout.setCenter(showUserOverview);
} catch (IOException e) {
}
}
/**
* Getter and setter.
*
* @return
*/
public BorderPane getBorderPane() {
return rootLayout;
}
}
我还尝试动态设置控制器,但没有改变任何事情。
我从编译器中得到的错误如下:
"C:\Program Files\Java\jdk1.8.0_121\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:6660,suspend=y,server=n -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;C:\Users\agoebbel\Tempo Box\Development & PS\Eclipse-Workspaces\userMan\out\production\userMan;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.3.4\lib\idea_rt.jar" org.aebian.umFrontend.Frontend
Connected to the target VM, address: '127.0.0.1:6660', transport: 'socket'
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.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
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.control.MenuItem.fire(MenuItem.java:462)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$343(ContextMenuContent.java:1358)
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.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:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
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)
... 43 more
Caused by: java.lang.NullPointerException
at org.aebian.umFrontend.view.FrontendView.showAbout(FrontendView.java:115)
at org.aebian.umFrontend.view.FrontendViewController.handleButtonAction(FrontendViewController.java:39)
... 53 more
因此,我可以直接运行showLogin()、showAbout()等方法,这不是输入流的错误。
如果您需要我的某个FXML文件:
umFrontendAbout.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.text.Font?>
<VBox alignment="CENTER" prefHeight="600.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.aebian.umFrontend.view.FrontendView">
<children>
<SplitPane focusTraversable="true" orientation="VERTICAL" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
<items>
<AnchorPane prefHeight="576.0" prefWidth="328.0">
<children>
<Label layoutX="272.0" layoutY="121.0" text="Java User Managment">
<font>
<Font size="24.0" />
</font>
</Label>
<Label layoutX="228.0" layoutY="164.0" text="A java written user management solution with mysql support" />
<Label layoutX="251.0" layoutY="181.0" text="© 2017 by Adrian (Simmarith) & Alexander (Aebian)" />
<Label alignment="CENTER" layoutX="38.0" layoutY="14.0" minWidth="60.0" prefWidth="-1.0" style=" " text="User Management \ About" textAlignment="CENTER" wrapText="false">
<font>
<Font size="18.0" fx:id="x1" />
</font>
<textFill>
<Color blue="0.624" green="0.624" red="0.624" fx:id="x2" />
</textFill>
</Label>
<Label layoutX="338.0" layoutY="220.0" text="aebian@aebian.org" />
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</VBox>
我怎样才能解决这个问题
我尝试过的对我不起作用的事情:
- 通过以下方式动态设置控制器:
- 在控制器内创建了setPrimaryStage方法
尝试保存在showRoot()上初始化的rootLayout,以便可以在HandleButtoAction()的showAbout上使用它 在调试和尝试之后,我自己解决了这个问题。 问题是控制器没有获得初始化值。当方法开始运行时,仅存在一个。因此,我要么需要在控制器中安装“应用程序”,要么因为JavaFX已经基于MVC,所以我可以将控制器与视图类本身合并 我做了第二个选择,它现在起作用了。 谢谢你的帮助
艾比安出来了 我到底要怎么做?我试过showRoot();使用this.rootLayout=rootLayout的方法;并尝试创建一个getter。很抱歉,我没有很好地阅读代码。您是否尝试重命名
BorderPane bPane=FView.getBorderPane()
toBorderPane rootLayout=FView.getBorderPane()在FrontendViewController.class上编写>并使用以下命令编辑showAbout()方法:this.rootLayout.setCenter(vDefault)代码>我做了,并相应地更新了代码,stacktrace也保持不变。嗯,我猜showAbout()是在showRoot()之前加载的,但我不知道其他方法FView.showAdminOverview()是否是这样的
和FView.showUserOverview()代码>工作?如果不是,我的猜测是,您在控制器上初始化的对象FView与之前创建的对象FView不同,或者没有执行方法start();此外,您还可以尝试使用IDE的调试器,并在方法FView.showAbout()之前检查是否代码>根布局已初始化。其他方法正在生成相同的错误!这是我的断点的输出。为什么希望在FrontendViewController
中创建的FrontendView
实例中初始化rootLayout
?它由start
方法初始化(有效),该方法在启动应用程序时对为您创建的实例调用。这只是结构不正确:您不应该自己创建应用程序
类的实例,而应用程序
类只应该启动应用程序。您需要重新构造代码,使其适合FX应用程序的生命周期。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.text.Font?>
<VBox alignment="CENTER" prefHeight="600.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.aebian.umFrontend.view.FrontendView">
<children>
<SplitPane focusTraversable="true" orientation="VERTICAL" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
<items>
<AnchorPane prefHeight="576.0" prefWidth="328.0">
<children>
<Label layoutX="272.0" layoutY="121.0" text="Java User Managment">
<font>
<Font size="24.0" />
</font>
</Label>
<Label layoutX="228.0" layoutY="164.0" text="A java written user management solution with mysql support" />
<Label layoutX="251.0" layoutY="181.0" text="© 2017 by Adrian (Simmarith) & Alexander (Aebian)" />
<Label alignment="CENTER" layoutX="38.0" layoutY="14.0" minWidth="60.0" prefWidth="-1.0" style=" " text="User Management \ About" textAlignment="CENTER" wrapText="false">
<font>
<Font size="18.0" fx:id="x1" />
</font>
<textFill>
<Color blue="0.624" green="0.624" red="0.624" fx:id="x2" />
</textFill>
</Label>
<Label layoutX="338.0" layoutY="220.0" text="aebian@aebian.org" />
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</VBox>