当前位置: 首页 > 知识库问答 >
问题:

如何使用observableArray填充组合框?

百里默
2023-03-14

我正在创建一个影院系统,用户可以通过主页中的组合框选择电影。我在FilmController类中创建了一个数组列表,然后将其转换为observableList,并且正在努力将其内容填充到combobox(HomepageController)中。

这是arraylist的FilmController

public class FilmController {

private ArrayList<Film> films = new ArrayList<>();

public FilmController() {
    Film f1 = new Film("Avatar", "James Cameron", "James Cameron",
            "Sam Wortherington" + "Zoe Saldana", "162", "Sci-Fi", 8.50);

    Film f2 = new Film("Black Panther", "Kevin Feige", "Ryan Coogler",
            "Chadwick Boseman" + "Lupita Nyong'o", "135", "Sci-Fi Fantasy", 10.00);

    Film f3 = new Film("Creed 2", "Sylvester Stallone", "Steven Caple Jr",
            "Michael B Jordan" + "Tessa Thompson", "130", "Drama", 10.00);

    Film f4 = new Film("Deadpool", "Simon Kinberg", "Tim Miller",
            "Ryan Reynolds" + "Morena Baccarin", "109", "Sci-Fi", 7.50);

    Film f5 = new Film("A Quiet Place", "Michel Bay", "John Krasinski",
            "Emily Blunt" + "John Krasinski", "91", "Thriller", 8.00);

    films.add(f1);
    films.add(f2);
    films.add(f3);
    films.add(f4);
    films.add(f5);
}

public ArrayList<Film> getFilms() {
    return films;
}

public ObservableList<Film> getOlFilms() {
    return FXCollections.observableArrayList(films);

   }
}

我尝试在HomepageController中实现此功能,但它似乎给了我一个错误:

  public class HomepageController {

        public ComboBox cbFilms;

public void initialize() { 
cbFilms.setButtonCell((ListCell) cbFilms.getCellFactory().call(null)); 
}

public void cbListFilms(ActionEvent actionEvent) {
        FilmController f = new FilmController();
        cbFilms.setItems(f.getOlFilms().toArray());
    } 
}

我已经研究过这个问题,但它似乎对我不起作用。

我希望组合框只列出电影名称,最好是当鼠标悬停在电影名称上时,如果可能的话,我希望它显示其余的属性。

这是组合框的fxml内容:

    <ComboBox fx:id="cbFilms" layoutX="291.0" layoutY="138.0" onAction="#cbListFilms" prefHeight="31.0" prefWidth="230.0"
          promptText="Please select film by name" style="-fx-background-color: tan;">
    <items>
        <FXCollections fx:factory="observableArrayList"/>
    </items>
    <effect>
        <SepiaTone/>
    </effect>
</ComboBox>

共有2个答案

隗新霁
2023-03-14

您不需要/不想调用。toArray()方法,位于可观察列表上。组合框。setItems()方法获取一个可观察列表(ObservableList):

cbFilms.setItems(f.getOlFilms());

然后,为了使组合框仅显示电影的标题,您需要在组合框上设置一个字符串转换器。StringConverter基本上获取对象并返回其表示形式:

cbFilms.setConverter(new StringConverter<Film>() {
    @Override
    public String toString(Film film) {
        return film.getTitle();
    }

    @Override
    public Film fromString(String string) {
        return null;
    }
});

以下是您可以测试的完整示例:

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class SimpleComboBoxExample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        // Create some sample data
        ObservableList<Film> filmsList = FXCollections.observableArrayList();
        filmsList.add(new Film("Titanic", "James Cameron"));
        filmsList.add(new Film("Jaws", "Steven Spielberg"));
        filmsList.add(new Film("The Last Samurai", "Edward Zwick"));

        // Define our ComboBox with our data model as its type
        ComboBox<Film> cboFilms = new ComboBox<>();

        // Use a StringConverter to configure our ComboBox to display only the film's title
        cboFilms.setConverter(new StringConverter<Film>() {
            @Override
            public String toString(Film film) {
                return film.getTitle();
            }

            @Override
            public Film fromString(String string) {
                return null;
            }
        });

        // Finally, set our ComboBox's items to our sample list
        cboFilms.setItems(filmsList);

        root.getChildren().add(cboFilms);

        // Show the Stage
        primaryStage.setWidth(300);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

// Our data model class
class Film {

    private StringProperty title = new SimpleStringProperty();
    private StringProperty director = new SimpleStringProperty();

    public Film(String title, String director) {
        this.title.set(title);
        this.director.set(director);
    }

    public String getTitle() {
        return title.get();
    }

    public StringProperty titleProperty() {
        return title;
    }

    public String getDirector() {
        return director.get();
    }

    public StringProperty directorProperty() {
        return director;
    }
}

结果:

公良光熙
2023-03-14

您应该设置一个CellFactory,它处理ComboBox中的所有项目:

ComboBox<Film> comboBox = new ComboBox<>();
comboBox.setItems(f.getOlFilms());
comboBox.setCellFactory(param -> new ListCell<Film>() {
    @Override
    protected void updateItem(Film item, boolean empty) {
        super.updateItem(item, empty);
        if (item != null) {
            setText(item.getName());
        } else {
            // handle null object
        }
    }
});

此外,您应该为所选项目设置ButtonCell。您可以为其创建自己的ListCell,以便在视图中添加更多数据,也可以使用与以下项目相同的ListCell:

comboBox.setButtonCell(comboBox.getCellFactory().call(null));

作为null值的替代方案,您可以在那里传递默认值。

 类似资料:
  • 说到编程或java,我只是一个完全的初学者。所以一开始,我的计划是使用JavaFX(结合场景构建器)创建一个窗口,在那里我有一个按钮,可以引导我进入另一个窗口,在那里我有一个组合框。我谷歌了几个小时,想找到一种方法来填充组合框,但我找到的所有解决方案都不适合我。这就是为什么我认为我在这里犯了一些错误,我希望你能以某种方式帮助我。或者在列表中给我一个提示,我应该学习/阅读什么才能自己找到解决方案。首

  • 我想在一个组合框中填充一些数据。这很好。但是,我想动态地改变组合框中的数据。 目前我有一个表,在组合框中,我在表列中显示数据的唯一值。现在,表数据存储在静态可观察列表变量中。我想根据表中显示的数据更改组合框中的数据。也就是说,如果存储表数据的静态可观察列表发生更改,我希望在没有手动干预的情况下更改组合框数据。 如果没有单独的静态变量用于组合框,这是否可能?

  • 假设我有一个整数数组,如和一个简单的字符串,如。我如何循环通过数组和填充每一个值。假设是这样的: 输出: 到目前为止,我已经尝试了以下内容: 但是,它在print语句中给出了。解决这个问题最好的方法是什么?

  • 在我的模型中,我有和对象,它们表示从文件中读取的表格数据。每个都可以返回单元格列表。我想用值填充TableView,类似于: 我找到的大多数教程都处理与某个对象的字段关联的列,但我只想显示数据,而不知道列代表什么。

  • 我正在查询Sql Server并返回一个List-我想使用此List作为我的组合框的源。下面是我正在使用的代码,它运行时没有错误,但我的组合框始终为空并且从不填充。这里有什么不正确的? 主要的Java语言 样品fxml

  • 我无法填充从场景生成器创建的JavaFX组合框。虽然我已经搜索过了,但我找不到解决这个错误的方法。 下面的例子都不管用。 帮助将不胜感激。