- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个 JavaFX 用户界面 (fxml) 并将一个 Controller 类绑定(bind)到它,一切正常,直到我在应用程序中为 ListView 添加了 ObservableList 和 ChangeListener。当我运行应用程序时,ListView 看起来很好并显示正确的值,但是当我单击某些按钮时,会发生异常并且按钮将不起作用。这些按钮在单击时应该显示其他布局。异常表示未找到布局(例如 AddUser.fxml),但它存在并且到目前为止工作正常!
Controller 类的一些行:
public class FileSharingController implements Initializable {
private ObservableList<User> UsersListData=FXCollections.observableArrayList();
@FXML
private ListView<User> UsersList;
public FileSharingController(){
DatabaseManager DB=new DatabaseManager();
try {
UsersListData.addAll(DB.returnUsers());
} catch (SQLException e) {e.printStackTrace();}
}
@Override
public void initialize(URL location, ResourceBundle resources) {
UsersList.setItems(UsersListData);
UsersListData.addListener(new ListChangeListener<User>(){
@Override
public void onChanged(Change<? extends User> c) {
System.out.println(c.getList());
}
});
}
@FXML
public void showAddUserLayout(){
try {Stage stage=new Stage();
AnchorPane rootPane=FXMLLoader.load(getClass().getResource("AddUser.fxml"));
Scene scene = new Scene(rootPane);
stage.setScene(scene);
stage.setTitle("Add User");
stage.show();
} catch (IOException e) {e.printStackTrace();}
}
}
用户类(模型):
package Model;
public class User {
private String Username;
private String Password;
public User(String Username,String Password){
this.Username=Username;
this.Password=Password;
}
public void Set(String Username,String Password){
this.Username=Username;
this.Password=Password;
}
public String toString(){
return Username+" "+Password;
}
}
当我单击“添加”按钮时,调用 showAddUserLayout() 并出现以下异常:
java.lang.NullPointerException
/D:/workspace_FileSharing%20Serverside/FileSharing_ServerSide/bin/com/Shayan/FileSharing/Server/AddUser.fxml
at com.Shayan.FileSharing.Server.FileSharingController.updateUsersList(FileSharingController.java:144)
at com.Shayan.FileSharing.Server.FileSharingController.initialize(FileSharingController.java:50)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2152)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2742)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2721)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2694)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2683)
at com.Shayan.FileSharing.Server.FileSharingController.showAddUserLayout(FileSharingController.java:100)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1437)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3113)
at javafx.scene.Scene$ClickGenerator.access$8600(Scene.java:3051)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3333)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3164)
at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3119)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1559)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2261)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:228)
at com.sun.glass.ui.View.handleMouseEvent(View.java:528)
at com.sun.glass.ui.View.notifyMouse(View.java:922)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
at java.lang.Thread.run(Thread.java:722)
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
请帮忙!我不知道发生了什么...提前致谢!
最佳答案
您发布的代码不完整。 FXMLLoader 正在加载“AddUser.fxml”文件。它还调用 Controller 的初始化方法。但是 nullpointerException 出现在 updateUsersList() 方法的第 144 行处。检查那条线。您可能希望将“AddUser.fxml”的 Controller 类更改为 FileSharingController 之外的其他类。
根据评论,每个布局都需要一个单独的 Controller 吗?
技术上不,但语义上是。如果您在不同的 FXML 文件中设置相同的 fx:controller
,那么您最终会为加载的每个 FXML 文件获得该 Controller 的多个实例。如果您将 FXMLLoader.setController()
与 FXMLLoader.setRoot()
一起使用,其中 FXML 文件包含 fx:root
而不是 fx :controller
那么您最终将只得到一个 Controller 实例,对于加载的每个 FXML 文件,将分别调用其 initialize()
方法。然而,在这两种情况下,每个 FXML 文件在语义上只会处理 Controller 的某些部分,即初始化、注入(inject)、设置、操作它感兴趣的部分。在我看来,FXML 文件应该没有共同域,如果有,那么它们必须通过自己的 Controller 使用正常的 java 消息传递机制。因此,拥有另一个 AddUserController 类将更加模块化、可维护并且更少麻烦。
关于javaFX:如何创建 Live ListView 并向其添加 ChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17770511/
我是一名优秀的程序员,十分优秀!