📜  对象的 javafx listview - Java (1)

📅  最后修改于: 2023-12-03 15:25:11.821000             🧑  作者: Mango

对象的 JavaFX ListView

在 JavaFX 中,ListView 是一个常用的 UI 控件,它用于显示一组可滚动的数据项。ListView 可以用于显示任何类型的对象,因为它需要一个适配器来将对象转换为可视化的节点。在本文中,我们将学习如何将对象添加到 ListView 中以及如何显示和编辑它们。

创建 JavaFX ListView

要创建 ListView,我们需要在 FXML 文件中添加以下代码:

<ListView fx:id="listView" />

以上代码将创建一个空的 ListView,它可以在 Java 代码中使用。

向 JavaFX ListView 中添加对象

要向 ListView 添加对象,我们需要创建一个适配器来将对象转换为可视化的节点。适配器必须扩展 ListCell 类,并实现 updateItem() 方法来更新节点的内容。然后,我们将适配器设置为 ListView 的单元格工厂。下面是一个简单的适配器示例:

public class PersonCell extends ListCell<Person> {
    @Override
    protected void updateItem(Person person, boolean empty) {
        super.updateItem(person, empty);
        if (empty || person == null) {
            setText(null);
        } else {
            setText(person.getName());
        }
    }
}

在上面的示例中,我们创建了一个名为 PersonCell 的适配器,它将 Person 对象转换为名字的字符串。然后,我们将适配器设置为 ListView 的单元格工厂:

listView.setCellFactory(param -> new PersonCell());

现在,我们可以将对象添加到 ListView 中:

listView.getItems().add(new Person("Alice"));
listView.getItems().add(new Person("Bob"));

在上面的示例中,我们向 ListView 添加两个 Person 对象,其中每个对象都有一个名字。ListView 现在会将这些对象转换为可视化的节点,并将它们显示出来。

JavaFX ListView 的选择模型

ListView 有几种不同的选择模型,我们可以使用以下方法之一来设置它:

listView.setSelectionModel(new SingleSelectionModel<>());
listView.setSelectionModel(new MultipleSelectionModel<>());
listView.setSelectionModel(new ToggleSelectionModel<>());

在上面的示例中,我们创建了三种选择模型:单选模型、多选模型和切换选择模型。这些模型允许用户以不同的方式选择节点。

处理 JavaFX ListView 的选择事件

要处理 ListView 的选择事件,我们需要为 SelectionModel 添加一个更改监听器。我们可以使用以下方法之一来添加监听器:

listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
    System.out.println("Selected: " + newValue);
});
listView.getSelectionModel().selectedIndicesProperty().addListener((observable, oldValue, newValue) -> {
    System.out.println("Selected indices: " + newValue);
});

在上面的示例中,我们创建了两个更改监听器,它们分别监听选定的条目和选定的索引。每当用户更改选择时,都会触发监听器。

编辑 JavaFX ListView 中的对象

要在 ListView 中编辑对象,我们可以将单元格工厂设置为一个具有编辑功能的适配器。然后,我们可以使用 setEditing() 方法来开启或关闭编辑模式。下面是一个简单的可编辑适配器示例:

public class EditablePersonCell extends ListCell<Person> {
    private TextField textField;

    public EditablePersonCell() {
        ListCell<Person> thisCell = this;
        textField = new TextField();
        textField.setOnAction(event -> commitEdit(new Person(textField.getText())));
        textField.focusedProperty().addListener((observable, oldValue, newValue) -> {
            if (!newValue) {
                commitEdit(new Person(textField.getText()));
                thisCell.setText(textField.getText());
            }
        });
        setGraphic(textField);
    }

    @Override
    protected void updateItem(Person person, boolean empty) {
        super.updateItem(person, empty);
        if (empty || person == null) {
            setText(null);
            setGraphic(null);
        } else {
            textField.setText(person.getName());
            setGraphic(textField);
            setText(null);
        }
    }
}

在上面的示例中,我们创建了一个名为 EditablePersonCell 的可编辑适配器。适配器包含一个 TextField,它在用户单击单元格时被显示出来。TextField 允许用户更改 Person 对象的名称。当用户完成编辑后,我们将使用 commitEdit() 方法将新的 Person 对象提交给 ListView

然后,我们将可编辑适配器设置为 ListView 的单元格工厂:

listView.setCellFactory(param -> new EditablePersonCell());

现在,我们可以编辑 ListView 中的对象了。

结论

JavaFX 的 ListView 控件非常适合显示对象列表。我们可以使用一个适配器将对象转换为可视化的节点,并使用选择模型来处理选定的节点。如果需要编辑对象,我们可以使用可编辑适配器。