如何浏览JavaFX上的按钮列表并根据所述按钮的数据显示场景

如何浏览JavaFX上的按钮列表并根据所述按钮的数据显示场景,java,javafx,Java,Javafx,我正在制作一个电影院/电影院预订系统 我设置了一个按钮列表,用于显示主页中播放的电影列表。我正在尝试做一个功能,当我们点击主页上的一个按钮时,它会改变场景,在那里你可以看到电影的全部细节 问题是它总是只显示我电影列表中的第一部电影 我试着设置一些指针来识别每个按钮 以下是对象: filmPointer从1开始,因为filmNumber从1开始,如果我将其设置为0,也会弹出一个错误 private static List<User> userList = User.getList();

我正在制作一个电影院/电影院预订系统

我设置了一个按钮列表,用于显示主页中播放的电影列表。我正在尝试做一个功能,当我们点击主页上的一个按钮时,它会改变场景,在那里你可以看到电影的全部细节

问题是它总是只显示我电影列表中的第一部电影

我试着设置一些指针来识别每个按钮

以下是对象:

filmPointer从1开始,因为filmNumber从1开始,如果我将其设置为0,也会弹出一个错误

private static List<User> userList = User.getList();
private static List<Film> filmList = Film.getList();
private static ArrayList<Button> allFilmLink = new ArrayList<>();
public static int filmPointer = 1, accountPointer; 
private static List userList=User.getList();
私有静态列表filmList=Film.getList();
私有静态ArrayList allFilmLink=新ArrayList();
公共静态int filmPointer=1,accountPointer;
在主页上显示带有图像的按钮的功能:

public void filmListContent(){
    mainPane.setContent(filmListPane);

    for (int x = 0; x < filmList.size(); x++) {
        Button listFilmButton = new Button();
        listFilmButton.setPrefHeight(300);
        listFilmButton.setPrefWidth(250);
        int finalX = x;
        listFilmButton.setOnAction(actionEvent -> {
            mainWindow.setScene(currentFilmScene); //open film detail
            filmPointer = filmList.get(finalX).getNumberFilm();

        });
        imageFilm = new Image(getClass().getResourceAsStream(filmList.get(x).pathPictureFilm), 250, 350, false, false);
        listFilmButton.setGraphic(new ImageView(imageFilm));

        allFilmLink.add(listFilmButton);
    }
    showFilmLink();
}
public void filmListContent(){
设置内容(filmListPane);
对于(int x=0;x{
main window.setScene(currentFilmScene);//打开胶片细节
filmPointer=filmList.get(finalX.getNumberFilm();
});
imageFilm=新图像(getClass().getResourceAsStream(filmList.get(x).pathPictureFilm),250350,false,false);
setGraphic(新的ImageView(imageFilm));
添加(listFilmButton);
}
showFilmLink();
}
下面是我在另一个类中设置场景及其函数的代码:

private void createFilmScene(){
    Text filmTitle = null;
    filmPane = new GridPane();
    HBox titleHB;

    for (int x = 0; x < filmList.size(); x++) {
            if (filmList.get(x).getNumberFilm() == Main.filmPointer) {
                filmPictureStream = new Image(getClass().getResourceAsStream(filmList.get(x).getPathPictureFilm()));
                filmPictureView = new Label("", new ImageView((filmPictureStream)));
                filmTitle = new Text(filmList.get(x).getTitle());

        }
    }

    filmTitle.setFont(Font.font("Times New Roman", FontWeight.BOLD, 30));
    titleHB = new HBox(11);
    titleHB.setAlignment(TOP_CENTER);
    titleHB.getChildren().add(filmTitle);
    filmPane.add(titleHB, 5, 19);
    filmPane.add(filmPictureView, 2, 2, 2, 2); // placement not final
    filmPane.setHgap(5);
    filmPane.setVgap(15);

}
private void createFilmScene(){
Text filmTitle=null;
filmPane=新的GridPane();
HBox-titleHB;
对于(int x=0;x
如果我在47米处点击,我希望场景会发生变化,然后详细描述我点击的电影。但它总是显示它第二章

我的主页:


当我点击47米下方时,我的电影详细信息页面:

问题是
createFilmScene()
调用得太早(在
start
方法中)。我是这样编码的,因为我认为在使用它之前必须先初始化
currentFilmPane
currentFilmScene

代码:

public void filmListContent(){
设置内容(filmListPane);
对于(int x=0;x{
filmPointer=filmList.get(finalX.getNumberFilm();
currentFilmPane=新的GridPane();
FilmPage setFilmPane=新的FilmPage(当前FilmPane);
currentFilmScene=新场景(setFilmPane.aspant(),1920,1080);
主窗口.setScene(当前电影场景);
});
imageFilm=新图像(getClass().getResourceAsStream(filmList.get(x).pathPictureFilm),250350,false,false);
setGraphic(新的ImageView(imageFilm));
添加(listFilmButton);
}
showFilmLink();
}

我建议
ListView
浏览
HBox
。你什么时候调用
createFilmScene()
?它似乎是在调用任何事件处理程序之前运行的。。。顺便说一句:我强烈建议不要使用
静态
字段来传递数据。以这种方式控制信息流是非常困难的。任何顺序错误的更新都可能破坏你的程序…帮助调试不完整的代码是相当困难的,a可能会帮助你得到答案。在每个按钮的setOnAction调用中,您将场景设置为
currentFilmScene
,但您提供的代码没有关于如何创建或更新此值的参考。此外,使用静态指针运行逻辑到数组中是一种天生脆弱的操作方式。通常,在前面创建所有场景效率很低,您可能只需要创建一个场景,以便在按下与电影相关联的按钮时查看电影上的信息。或者,基于arch的应用程序会将用于显示电影信息的可重复使用的单个场景与可变模型数据实例相关联,每个电影有一个模型实例,用户界面会随着模型数据的变化而自动更新。如果不了解应用程序,就很难提出设计建议。但是您可以将
createFilmScene()
替换为从布局窗格派生的
FilmPane
类。在课堂上,提供一个
setFilm(film)
方法。创建FilmScene的单个实例。在主页上,循环浏览所有影片的列表,在每个影片上创建一个按钮,用于在电影场景中设置影片,例如:
for(film-film:films){button-viewButton=new-button(“View-film”);mainLayout.add(viewButton);viewButton.setOnAction(event->filmScene.setFilm(film));}
public void filmListContent() {
    mainPane.setContent(filmListPane);

    for (int x = 0; x < filmList.size(); x++) {
        Button listFilmButton = new Button();
        listFilmButton.setPrefHeight(300);
        listFilmButton.setPrefWidth(250);
        int finalX = x;
        listFilmButton.setOnAction(actionEvent -> {
            filmPointer = filmList.get(finalX).getNumberFilm();
            currentFilmPane = new GridPane();
            FilmPage setFilmPane = new FilmPage(currentFilmPane);
            currentFilmScene = new Scene(setFilmPane.asParent(), 1920, 1080);
            mainWindow.setScene(currentFilmScene);

        });
        imageFilm = new Image(getClass().getResourceAsStream(filmList.get(x).pathPictureFilm), 250, 350, false, false);
        listFilmButton.setGraphic(new ImageView(imageFilm));

        allFilmLink.add(listFilmButton);
    }
    showFilmLink();
}