为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

aluckdog 2022-08-17 10:17:44
我一直在构建一个电影院预订应用程序,并试图创建一个显示电影和放映时间的场景。当我使用锚点窗格和vbox显示所有信息时,它可以工作,但是当我尝试插入其他滚动窗格(在场景构建器中)时,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>主类public class MovieShowings{    private AnchorPane root;    public MovieShowings() {        try {            root = FXMLLoader.load(getClass().getResource("movieshowings.fxml"));        }        catch(IOException e){            e.printStackTrace();        }    }    public Scene getScene() {    Scene scene = new Scene(root,800,600);    return scene;    }    public AnchorPane getRoot() {        return root;    }}和在用户登录后调用它的代码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 加载程序
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

这样做的原因是增加了内容,等等。在创建外观时,在第一个布局传递期间添加到场景。此布局传递发生在 JavaFX 应用程序线程“重新获得控制权”之后(即,您已完成事件处理程序、方法或让 JavaFX 执行代码的类似方式)。ScrollPaneScrollBarApplication.start


请注意,您正在以一种非常奇怪的方式使用控制器类。我建议使用这个问题的答案中描述的方法之一与控制器进行通信:传递参数JavaFX FXML


例如:


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);

    }


    ...

}

由于您实际上并没有在控制器中使用该对象,因此可以通过从MovieShowings


@FXML

private void initialize()

方法,并从控制器代码中删除每个与之相关的部分。通过这种方式,您可以摆脱将其传递给控制器的必要性。MovieShowings


使用使用自定义单元格也可以是显示电影的选项...ListView


查看完整回答
反对 回复 2022-08-17
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信