📅  最后修改于: 2023-12-03 15:25:11.821000             🧑  作者: Mango
在 JavaFX 中,ListView
是一个常用的 UI 控件,它用于显示一组可滚动的数据项。ListView
可以用于显示任何类型的对象,因为它需要一个适配器来将对象转换为可视化的节点。在本文中,我们将学习如何将对象添加到 ListView
中以及如何显示和编辑它们。
要创建 ListView
,我们需要在 FXML 文件中添加以下代码:
<ListView fx:id="listView" />
以上代码将创建一个空的 ListView
,它可以在 Java 代码中使用。
要向 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
现在会将这些对象转换为可视化的节点,并将它们显示出来。
ListView
有几种不同的选择模型,我们可以使用以下方法之一来设置它:
listView.setSelectionModel(new SingleSelectionModel<>());
listView.setSelectionModel(new MultipleSelectionModel<>());
listView.setSelectionModel(new ToggleSelectionModel<>());
在上面的示例中,我们创建了三种选择模型:单选模型、多选模型和切换选择模型。这些模型允许用户以不同的方式选择节点。
要处理 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);
});
在上面的示例中,我们创建了两个更改监听器,它们分别监听选定的条目和选定的索引。每当用户更改选择时,都会触发监听器。
要在 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
控件非常适合显示对象列表。我们可以使用一个适配器将对象转换为可视化的节点,并使用选择模型来处理选定的节点。如果需要编辑对象,我们可以使用可编辑适配器。