在JavaFX中,折叠/展开树元素会更改单元格值
我有一个树型表,当单元格的行名等于列名时,我为单元格设置文本。它可以成功地工作,但当我折叠或扩展树元素或向下滚动值时,它的单元格会发生变化。我怎样才能克服这个问题?我必须在updateItem方法中为单元格设置文本吗在JavaFX中,折叠/展开树元素会更改单元格值,java,javafx,treetableview,Java,Javafx,Treetableview,我有一个树型表,当单元格的行名等于列名时,我为单元格设置文本。它可以成功地工作,但当我折叠或扩展树元素或向下滚动值时,它的单元格会发生变化。我怎样才能克服这个问题?我必须在updateItem方法中为单元格设置文本吗 private TreeTableView<String> drawTable() { root.setExpanded(true); // ////////////////treetable////////////////////////////
private TreeTableView<String> drawTable() {
root.setExpanded(true);
// ////////////////treetable////////////////////////////
/**
* makes treeTable and set the nodes to it.
* */
treeTable.setRoot(root);
Arrays.stream(dc.getRootKeys()).forEach(
rootKey -> root.getChildren().add(
createTreeItem(dc.getCombiFunc(), rootKey)));
// ////////////////First column/////////////////////////
/**
* creates first column with no caption and sets treeview for that.
* */
TreeTableColumn<String, String> firstColumn = new TreeTableColumn<>("");
treeTable.getColumns().add(firstColumn);// Tree column
firstColumn.setEditable(false);
firstColumn.setSortable(false);
firstColumn
.setCellValueFactory(new Callback<CellDataFeatures<String, String>, ObservableValue<String>>() {
public ObservableValue<String> call(
CellDataFeatures<String, String> p) {
return new ReadOnlyStringWrapper(p.getValue()
.getValue());
}
});
// //////////////////Rest Columns////////////////////////
/**
* go through all organizations which have a function and make column
*/
for (Entry<String, String> ent : dc.getSortedAssignedOrg().entrySet()) {
TreeTableColumn<String, ArrayList<String>> col = new TreeTableColumn<>();
Label label = new Label(ent.getValue());
col.setGraphic(label);
col.setEditable(false);
col.setSortable(false);
// //////////////cellfactory/////////////////////////
col.setCellFactory(new Callback<TreeTableColumn<String, ArrayList<String>>, TreeTableCell<String, ArrayList<String>>>() {
@Override
public TreeTableCell<String, ArrayList<String>> call(
TreeTableColumn<String, ArrayList<String>> param) {
return new TreeTableCell<String, ArrayList<String>>() {
public void updateItem(ArrayList<String> item,
boolean empty) {
super.updateItem(item, empty);
if (this.getTreeTableRow().getItem().equals(
label.getText()) {
setText("yes");
}
}
}
};
};
});// end cell factory
treeTable.getColumns().add(col);
}
// end for col
treeTable.setPrefWidth(1200);
treeTable.setPrefHeight(500);
treeTable.setShowRoot(false);
treeTable.setEditable(false);
treeTable.setTableMenuButtonVisible(true);
return treeTable;
}
//makes the tree hierarchy///
private TreeItem<String> createTreeItem(TreeMap<String, List<String>> data,
String rootKey) {
TreeItem<String> item = new TreeItem<>();
item.setValue(rootKey);
item.setExpanded(true);
List<String> childData = data.get(rootKey);
if (childData != null) {
childData.stream().map(child -> createTreeItem(data, child))
.collect(Collectors.toCollection(item::getChildren));
}
String valueName = item.getValue();
item.setValue((dc.getSortedfuncAll().get(valueName)));
return item;
}
}
private TreeTableView绘图表(){
root.setExpanded(true);
////树表////////////////////////////
/**
*使树成为可树并将节点设置为可树。
* */
树根;毛根(根);
Arrays.stream(dc.getRootKeys()).forEach(
rootKey->root.getChildren().add(
createTreeItem(dc.getCombiFunc(),rootKey));
////第一列/////////////////////////
/**
*创建没有标题的第一列,并为此设置treeview。
* */
TreeTableColumn firstColumn=新的TreeTableColumn(“”);
treeTable.getColumns().add(firstColumn);//树列
firstColumn.setEditable(false);
firstColumn.setSortable(false);
第一列
.setCellValueFactory(新回调(){
公共价值呼叫(
celldatap){
返回新的ReadOnlyStringWrapper(p.getValue())
.getValue());
}
});
/////Rest列////////////////////////
/**
*浏览所有具有职能的组织并制作专栏
*/
对于(条目ent:dc.getSortedAssignedOrg().entrySet()){
TreeTableColumn=新的TreeTableColumn();
Label Label=新标签(ent.getValue());
col.setGraphic(标签);
col.setEditable(false);
col.setSortable(假);
/////cellfactory/////////////////////////
col.setCellFactory(新回调(){
@凌驾
公用树电话(
TreeTableColumn参数){
返回新的TreeTableCell(){
公共无效更新项(ArrayList项,
布尔值(空){
super.updateItem(项,空);
如果(this.getTreeTableRow().getItem().equals(
label.getText()){
setText(“是”);
}
}
}
};
};
});//终端单元工厂
treeTable.getColumns().add(col);
}
//结束
树型。设置宽度(1200);
树的高度(500);
树表。设置显示根(假);
treeTable.setEditable(false);
treeTable.setTableMenuButtonVisible(true);
返回树型;
}
//创建树层次结构///
私有树Item createTreeItem(树映射数据,
字符串根键){
TreeItem=新的TreeItem();
item.setValue(rootKey);
item.setExpanded(true);
List childData=data.get(rootKey);
if(childData!=null){
childData.stream().map(child->createTreeItem(数据,子))
.collect(Collectors.toCollection(item::getChildren));
}
字符串valueName=item.getValue();
setValue((dc.getSortedfuncAll().get(valueName));
退货项目;
}
}
尝试使用以下命令而不是setText
this.getTreeTableRow().setItem("yes");
该代码确实太难阅读。请构造一个MCVE并更新您的问题。OAS,那些深入嵌套的for和ifs看起来可以改进。为了更清楚地说明,我省略了一些条件。我注意到,当程序启动时,它显示正确,但当我向下滚动时,一些单元格值也会发生变化。有吗停止表更新值的方法?此树表不可编辑。它仍会更改单元格值。