gpt4 book ai didi

java - 表格单元格中的 TreeView Java FX 8

转载 作者:行者123 更新时间:2023-12-01 22:58:20 33 4
gpt4 key购买 nike

我的 UI 中有一个 TableView,它显示数据库中的用户列表。该表的一列是可编辑的,当启用编辑时,该特定列的单元格将变成 TreeView ,列出可以选择的各种选项。

为了澄清,我正在尝试在表格单元格上实现类似日期选择器或颜色选择器的功能,但使用我自己的项目列表作为树。

表是这样定义的

private TableView<User> userTable;

显示 TreeView 的特定列的定义如下

private TableColumn<User, TreeView> col4;

我设置了这样的 setcellFactory 方法来显示树

col4.setCellFactory(new Callback<TableColumn<User,TreeView>, TableCell<User,TreeView>>() {

@Override
public TableCell<User, TreeView> call(
TableColumn<User, TreeView> param)
{
returns a comboboxtablecell which is filled with a tree
}
});

在表格中的相应列中,当我单击单元格时,该单元格显示一个组合框,打开时的组合框显示树值。

但是,当单元格处于不可编辑状态时,我不确定应该如何使用字符串值设置 setcellValuefactory

col4.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<User,TreeView>, ObservableValue<TreeView>>() {

@Override
public ObservableValue<TreeView> call(
CellDataFeatures< User,TreeView> param)
{
}
}

当单元格处于不可编辑状态时,我想将 TreeView 内的值显示为字符串。我不知道如何根据方法签名返回 TreeView 类型的可观察值并仍然显示字符串。

最佳答案

您需要区分 TableView数据 (它是 TableColumn s)正在呈现,以及用于呈现这些数据的单元格。 cellValueFactory是一个对象,它确定如何从整行的值中获取特定列的值(即数据)。 cellFactory是一个对象,它确定如何获取向用户呈现数据的单元格。

任何时候你写类似TableColumn<User, TreeView<...>>的东西这(几乎总是)是一个错误。类型参数中的第一个类型是表中每行中的对象的类型 - 这在这里很好 - 第二个类型是显示的数据的类型。 TreeView不是数据类型:它是 UI 元素的类型,即用于显示数据的内容的类型。

所以你想要一些类似的东西。 (您没有太具体地解释您的数据模型 - 这很好 - 但这可能不太正确;不过它会给您这个想法。)

TableView<User> userTable ;
TableColumn<User, Options> optionsCol ;

User类将有 ObjectProperty<Options> :

public class User {
private final ObjectProperty<Options> options = new SimpleObjectProperty<>(this, "options", new Options());
public final Options getOptions() {
return options.get();
}
public final void setOptions(Options options) {
this.options.set(options);
}
public ObjectProperty<Options> optionsProperty() {
return options ;
}

// other properties, etc...
}

显然,这取决于封装该列中显示的数据的选项类:

public class Options {
// properties etc
}

现在您只需使用默认的单元格值工厂:

optionsCol.setCellValueFactory(new PropertyValueFactory("options"));

(或者在 JavaFX 8 中,我更喜欢

    optionsCol.setCellValueFactory((TableColumn.cellDataFeatures<User, Options> data) -> 
data.getValue() // this is the User object
.optionsProperty() // this is an ObjectProperty<Options>, which is an ObservableValue<Options>
);

这在某种程度上更有效,因为它避免了 PropertyValueFactory 的反射使用,并且代码不多,特别是如果您省略 lambda 表达式的参数类型)。

(您不必像这样设置它。如果 Options 不是 User 的固有部分,那么您可以定义 Map<User, ObjectProperty<Options>> 并使用它返回ObjectProperty<Options> 与每个用户关联。我展示的方式只是最常见且可能最简单的方式。)

我真的不明白你的ComboBox在哪里适合,但这个答案应该足以让您根据需要进行处理。 cellFactory现在只需返回 TableCell使用 TreeView显示Options对象:

optionsCol.setCellFactory( col -> new TableCell<User, Options>() {
private TreeView<...> treeView ;
{
treeView = new TreeView<>(...);
// configure tree view, etc
}
@Override
public void updateItem(Options options, boolean empty) {
super.updateItem(options, empty) ;
if (empty) {
setGraphic(null);
} else {
// configure treeView with data from options, etc
setGraphic(treeView);
}
}
});

您提到单元格是可编辑的,因此您也需要连接单元格的所有编辑内容(并且您可能需要使用命名的[内部]类,因为它会变得有点冗长,而不是我这里有匿名内部类)。但这应该为您提供基本结构。

关于java - 表格单元格中的 TreeView Java FX 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23714859/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com