使用滚动窗格javafX时出现空指针异常
我一直在构建一个电影预订应用程序,并试图创建一个显示电影和放映时间的场景。当我使用锚定窗格和vbox显示所有信息时,它可以工作,但当我尝试在scenebuilder中插入其他滚动窗格时,FXML加载程序返回空指针异常,我无法找出原因 这是我的FXML代码使用滚动窗格javafX时出现空指针异常,java,javafx,scenebuilder,Java,Javafx,Scenebuilder,我一直在构建一个电影预订应用程序,并试图创建一个显示电影和放映时间的场景。当我使用锚定窗格和vbox显示所有信息时,它可以工作,但当我尝试在scenebuilder中插入其他滚动窗格时,FXML加载程序返回空指针异常,我无法找出原因 这是我的FXML代码 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?im
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="598.0" prefWidth="798.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MovieShowingsController">
<children>
<MenuBar>
<menus>
<Menu mnemonicParsing="false" text="myBookings">
<items>
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
</menus>
</MenuBar>
<ScrollPane fx:id="scrollpane" hbarPolicy="NEVER" layoutY="22.0" prefHeight="576.0" prefWidth="798.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="22.0">
<content>
<VBox fx:id="vbox" prefHeight="555.0" prefWidth="740.0" />
</content>
</ScrollPane>
</children>
</AnchorPane>
以及在用户登录后调用它的代码
if(DatabaseConnection.getInstance().login(Username.getText(), Password.getText())) {
MovieShowings films = new MovieShowings();
MovieShowingsController filmsController = new MovieShowingsController(films);
Scene movieShowings = films.getScene();
Stage window = (Stage) ((Node) e.getSource()).getScene().getWindow();
window.setScene(movieShowings);
window.show();
有没有办法解决这个问题
编辑:fx:id“vbox”未从getRoot方法访问,即使它已被注入到FXML加载程序中原因是ScrollPane添加了内容、滚动条等。在第一个布局过程中创建场景的蒙皮时将其复制到场景。此布局传递发生在JavaFX应用程序线程重新获得控制之后,即您使用事件处理程序、application.start方法或类似的方式让JavaFX执行代码 请注意,您正在以一种非常奇怪的方式使用控制器类。我建议使用此问题答案中描述的方法之一与控制器进行通信: 例如:
public class MovieShowings{
private AnchorPane root;
public MovieShowings() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("movieshowings.fxml"));
root = loader.load();
MovieShowingsController controller = loader.getController();
controller.initMovieShowings(this);
}
catch(IOException e){
e.printStackTrace();
}
}
...
}
由于您实际上没有在控制器中使用MovieShowings对象,因此可以通过从
@FXML
private void initialize()
方法,并从控制器代码中删除所有与电影放映相关的部分。这样,您就不需要将其传递给控制器
使用自定义单元格的列表视图也可以作为显示电影的选项…例外情况在哪里?哪一行抛出了它?可能与当vbox持有者被传递到buildMovieShowings方法时的情况相同明白了,我改变了我的控制器类的用法,它现在可以工作了。非常感谢。
public class MovieShowings{
private AnchorPane root;
public MovieShowings() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("movieshowings.fxml"));
root = loader.load();
MovieShowingsController controller = loader.getController();
controller.initMovieShowings(this);
}
catch(IOException e){
e.printStackTrace();
}
}
...
}
public class MovieShowingsController {
...
public void initMovieShowings(MovieShowings showings) {
String date = "2019-04-15";
Date sqlDate = Date.valueOf(date);
System.out.println("\n");
System.out.println("***Screenings for " + date + "***");
filmList = new ArrayList();
screeningList = DatabaseConnection.getInstance().retrieveScreeningsForDay(sqlDate);
for (Screening screeningInstance : screeningList) {
if (!filmList.contains(screeningInstance.getFilmInfo())) {
filmList.add(screeningInstance.getFilmInfo());
}
System.out.println(screeningInstance.toString());
}
Collections.sort(screeningList);
this.showings = showings;
//populating FXML instance variable from loader
// use the injected field here
buildMovieShowings(vbox);
}
...
}
@FXML
private void initialize()