带有自定义对象的 javafx CheckListView 显示特定 属性
javafx CheckListView with custom objects to show particular property
我的应用程序中有 controlsfx CheckListView。我正在显示我的自定义对象(例如:员工)。我已经创建了一个员工对象列表并将其包装在一个可观察列表中。现在我将可观察列表设置为我的 CheckListView。
checkListView.setItems(employeesObservableList);
到这里一切正常。
由于我绑定了员工对象,在列表视图中每个复选框的值都是我的员工对象的 toString()。我不想要那里的 toString() 值,而是我想要显示员工 (eno) 的其他 属性。
我在这里没有看到 cellValueFactory,而且我不知道如何利用 cellFactory 来完成我的任务,因为 CheckListView 已经设置了自己的 cellFactory。
所以我的问题是我想要一个带有我选择的复选框值的 CheckListView。
提前致谢!
CheckListView
使用的列表单元格是来自 javafx.scene.control.cell
的标准 CheckBoxListCell
。所以你可以用类似的东西覆盖 cellFactory
:
checkListView.setCellFactory(listView -> new CheckBoxListCell(checkListView::getItemBooleanProperty) {
@Override
public void updateItem(Employee employee, boolean empty) {
super.updateItem(employee, empty);
setText(employee == null ? "" : employee.getEno());
}
});
请注意,CheckBoxListCell<T>
有一个构造函数采用 Callback<T, BooleanProperty>
为显示项目的复选框指定布尔值 属性; CheckListView
定义了一个方法getItemBooleanProperty(T item)
,returns正好是这个值,所以这里可以使用方法引用直接传递给构造函数。
这是一个 SSCCE:
import org.controlsfx.control.CheckListView;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.cell.CheckBoxListCell;
import javafx.stage.Stage;
public class CheckListViewTest extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Test");
CheckListView<Employee> checkListView = new CheckListView<Employee>();
ObservableList<Employee> oblist = FXCollections.observableArrayList();
for (int i = 1; i <= 40; i++) {
oblist.add(new Employee("Employee " + i, i));
}
checkListView.setItems(oblist);
checkListView.setCellFactory(lv -> new CheckBoxListCell<Employee>(checkListView::getItemBooleanProperty) {
@Override
public void updateItem(Employee employee, boolean empty) {
super.updateItem(employee, empty);
setText(employee == null ? "" : String.format("Employee number: %04d", employee.getEno()));
}
});
checkListView.getCheckModel().getCheckedIndices().addListener(new ListChangeListener<Integer>() {
@Override
public void onChanged(javafx.collections.ListChangeListener.Change<? extends Integer> c) {
while (c.next()) {
if (c.wasAdded()) {
for (int i : c.getAddedSubList()) {
System.out.println(checkListView.getItems().get(i).getName() + " selected");
}
}
if (c.wasRemoved()) {
for (int i : c.getRemoved()) {
System.out.println(checkListView.getItems().get(i).getName() + " deselected");
}
}
}
}
});
Scene scene = new Scene(checkListView);
primaryStage.setScene(scene);
primaryStage.show();
}
public static class Employee {
private final StringProperty name = new SimpleStringProperty();
private final IntegerProperty eno = new SimpleIntegerProperty();
public Employee(String name, int eno) {
setName(name) ;
setEno(eno);
}
public final StringProperty nameProperty() {
return this.name;
}
public final String getName() {
return this.nameProperty().get();
}
public final void setName(final String name) {
this.nameProperty().set(name);
}
public final IntegerProperty enoProperty() {
return this.eno;
}
public final int getEno() {
return this.enoProperty().get();
}
public final void setEno(final int eno) {
this.enoProperty().set(eno);
}
}
public static void main(String[] args) {
launch(args);
}
}
结果是
我的应用程序中有 controlsfx CheckListView。我正在显示我的自定义对象(例如:员工)。我已经创建了一个员工对象列表并将其包装在一个可观察列表中。现在我将可观察列表设置为我的 CheckListView。
checkListView.setItems(employeesObservableList);
到这里一切正常。
由于我绑定了员工对象,在列表视图中每个复选框的值都是我的员工对象的 toString()。我不想要那里的 toString() 值,而是我想要显示员工 (eno) 的其他 属性。
我在这里没有看到 cellValueFactory,而且我不知道如何利用 cellFactory 来完成我的任务,因为 CheckListView 已经设置了自己的 cellFactory。
所以我的问题是我想要一个带有我选择的复选框值的 CheckListView。
提前致谢!
CheckListView
使用的列表单元格是来自 javafx.scene.control.cell
的标准 CheckBoxListCell
。所以你可以用类似的东西覆盖 cellFactory
:
checkListView.setCellFactory(listView -> new CheckBoxListCell(checkListView::getItemBooleanProperty) {
@Override
public void updateItem(Employee employee, boolean empty) {
super.updateItem(employee, empty);
setText(employee == null ? "" : employee.getEno());
}
});
请注意,CheckBoxListCell<T>
有一个构造函数采用 Callback<T, BooleanProperty>
为显示项目的复选框指定布尔值 属性; CheckListView
定义了一个方法getItemBooleanProperty(T item)
,returns正好是这个值,所以这里可以使用方法引用直接传递给构造函数。
这是一个 SSCCE:
import org.controlsfx.control.CheckListView;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.cell.CheckBoxListCell;
import javafx.stage.Stage;
public class CheckListViewTest extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Test");
CheckListView<Employee> checkListView = new CheckListView<Employee>();
ObservableList<Employee> oblist = FXCollections.observableArrayList();
for (int i = 1; i <= 40; i++) {
oblist.add(new Employee("Employee " + i, i));
}
checkListView.setItems(oblist);
checkListView.setCellFactory(lv -> new CheckBoxListCell<Employee>(checkListView::getItemBooleanProperty) {
@Override
public void updateItem(Employee employee, boolean empty) {
super.updateItem(employee, empty);
setText(employee == null ? "" : String.format("Employee number: %04d", employee.getEno()));
}
});
checkListView.getCheckModel().getCheckedIndices().addListener(new ListChangeListener<Integer>() {
@Override
public void onChanged(javafx.collections.ListChangeListener.Change<? extends Integer> c) {
while (c.next()) {
if (c.wasAdded()) {
for (int i : c.getAddedSubList()) {
System.out.println(checkListView.getItems().get(i).getName() + " selected");
}
}
if (c.wasRemoved()) {
for (int i : c.getRemoved()) {
System.out.println(checkListView.getItems().get(i).getName() + " deselected");
}
}
}
}
});
Scene scene = new Scene(checkListView);
primaryStage.setScene(scene);
primaryStage.show();
}
public static class Employee {
private final StringProperty name = new SimpleStringProperty();
private final IntegerProperty eno = new SimpleIntegerProperty();
public Employee(String name, int eno) {
setName(name) ;
setEno(eno);
}
public final StringProperty nameProperty() {
return this.name;
}
public final String getName() {
return this.nameProperty().get();
}
public final void setName(final String name) {
this.nameProperty().set(name);
}
public final IntegerProperty enoProperty() {
return this.eno;
}
public final int getEno() {
return this.enoProperty().get();
}
public final void setEno(final int eno) {
this.enoProperty().set(eno);
}
}
public static void main(String[] args) {
launch(args);
}
}
结果是