Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用滚动窗格javafX时出现空指针异常_Java_Javafx_Scenebuilder - Fatal编程技术网

使用滚动窗格javafX时出现空指针异常

使用滚动窗格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

我一直在构建一个电影预订应用程序,并试图创建一个显示电影和放映时间的场景。当我使用锚定窗格和vbox显示所有信息时,它可以工作,但当我尝试在scenebuilder中插入其他滚动窗格时,FXML加载程序返回空指针异常,我无法找出原因

这是我的FXML代码

<?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()