【发布时间】:2015-07-03 23:29:52
【问题描述】:
编辑#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),我的网站上没有太多可做的。
我通过 google 找到的许多示例(例如 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);
}
});
}
每个新项目都被正确标记为编辑(创建的文本字段及其内容被选中)。 在没有 Thread.sleep 的情况下使用 Platform.runLater 不起作用,而在没有 runLater 的情况下使用 Thread.sleep 也不行。
这根本感觉不对。我的问题是什么?
我提供了一个非常小的示例(eclipse)项目: https://www.dropbox.com/s/duos0ynw4rqp3yn/Test.zip?dl=0 包含主方法、FXML 文件和“有问题的”控制器。
【问题讨论】:
-
啊。现在我发布了我的问题,突然间我在stackoverflow 上发现了另一个(遗憾的是没有回答)问题
-
对我来说似乎是一个错误 - 您可以考虑报告它,以便有机会修复它
-
@kleopatra 恐怕你是对的。我会在 JavaFX Jira 平台上做一些研究,如果在那里找不到帮助,我可能会提交一个错误。