gpt4 book ai didi

java - 以编程方式编辑 TreeView/TreeItem

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:38:22 25 4
gpt4 key购买 nike

编辑 #2:由于它看起来像一个错误,我已经在 javaFx-jira 中发布了错误报告.您必须拥有一个帐户才能访问该问题。如果有新信息,我会及时更新这篇文章。

原帖:我有一个带有按钮和 TreeView 的简单 UI。如果按钮被按下,应该有一个新项目添加到 TreeView。该项目一出现在树中就应该是可编辑的。

import javafx.fxml.FXML;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.TextFieldTreeCell;
import javafx.util.converter.DefaultStringConverter;

public class ClientController {

@FXML
private TreeView<String> tree;

public void initialize() {
tree.setEditable(true);
tree.setCellFactory(p -> new TextFieldTreeCell<>(new DefaultStringConverter()));

TreeItem<String> root = new TreeItem<>();
root.setValue("Items");
root.setExpanded(true);

tree.setRoot(root);
}

@FXML
public void createItem() {
TreeItem<String> newItem = new TreeItem<>();
newItem.setValue("Item " + tree.getExpandedItemCount());

tree.getRoot().getChildren().add(newItem);
tree.requestFocus();
tree.getSelectionModel().select(newItem);
tree.edit(newItem);
}
}

我使用的 CellFactory 是 part of the JavaFX api .

如果我查看 api 文档 ( TreeView#edit ),我的网站上就没什么可做的了。

我通过谷歌找到了很多例子,比如 this为每个 TreeItem 创建一个上下文菜单。有用,但不是我现在想要的。

如果我选择/双击 UI 中的项目,我可以编辑任何以前创建的和现有的 TreeItem。我错过了什么吗?

编辑#1:

如果 createItem 方法更改为以下代码:

@FXML
public void createItem() throws InterruptedException {
TreeItem<String> newItem = new TreeItem<>();
newItem.setValue("Item " + this.tree.getExpandedItemCount());

this.tree.getRoot().getChildren().add(newItem);
this.tree.requestFocus();
this.tree.getSelectionModel().select(newItem);
Thread.sleep(100);
Platform.runLater(new Runnable() {
@Override
public void run() {
SimpleController.this.tree.edit(newItem);
}
});
}

每个新项目都被正确标记为编辑(创建的文本字段及其内容被选中)。使用Platform.runLater没有 Thread.sleep 不工作,Thread.sleep 没有 runLater 也没有。

这根本感觉不对。我的问题是什么?

我提供了一个非常小的示例(eclipse)项目: https://www.dropbox.com/s/duos0ynw4rqp3yn/Test.zip?dl=0包含主要方法、FXML 文件和“有问题的” Controller 。

最佳答案

TreeCells(即它们的内容和与 treeItem 的绑定(bind))在布局过程中延迟更新,这在下一个脉冲被激发时非常“迟到”。 Platform.runLater(..) 或任何硬编码延迟可能发生在该脉冲之前或之后,这(可能)就是为什么两者似乎都有效或无效的原因。

所以另一个古怪的技巧是在添加新项目之后和以编程方式开始编辑之前手动强制在树上重新布局:

root.getChildren().add(newItem);
tree.layout();
tree.edit(newItem);

不用说,这不是必需的 - 当前的行为是一个严重的错误,必须立即修复(...意思是...jdk 9)

关于java - 以编程方式编辑 TreeView/TreeItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29863095/

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