gpt4 book ai didi

java - 编辑单元格时 TreeView 显示错误

转载 作者:行者123 更新时间:2023-12-02 04:55:41 24 4
gpt4 key购买 nike

当我使用treeview时,我有两个错误,发生的情况如下:

BUG 1:不验证更改

如何创建错误:假设我想编辑 Treview 中的单元格“Id”。 picture 1

我输入其他内容:

picture 2

但是我改变了主意,我不想编辑这个项目,所以我没有点击输入并验证,而是点击了其他东西的左侧,一切看起来都很好,我回到了图一,但是如果我再次点击编辑“Id”单元格,我直接回到图2,并且显示“Id-Edit”,这意味着取消编辑效果不好......

BUG 2:值的变化

这种情况很少发生,但会发生,当我单击一个单元格进行编辑时,该单元格会采用另一个单元格的文本,这是一个示例:

picture 3

当我编辑它时,“Id”会采用另一个单元格的文本,但是如果我取消编辑,一切都会再次恢复正常,如图一所示。

这是我用于 TreeView 的代码:

    public class DatabaseStructureView extends TreeView<Object> {

TreeItem<Object> root;

public DatabaseStructureView() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("DatabaseStructureView.fxml"));

fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}

this.setEditable(true);
this.setCellFactory((TreeView<Object> param) -> new TextFieldTreeCellImpl());
root = new TreeItem<>();
this.setRoot(root);
setShowRoot(false);
root.setExpanded(true);
}

private final class TextFieldTreeCellImpl extends TreeCell<Object> {

private TextField textField;

@Override
public void startEdit() {
super.startEdit();

if (textField == null) {
createTextField();
}
setText(null);
setGraphic(textField);
textField.selectAll();
}

@Override
public void cancelEdit() {
super.cancelEdit();
setText(getString());
setGraphic(getTreeItem().getGraphic());
}

@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);

if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (textField != null) {
textField.setText(getString());
}
setText(null);
setGraphic(textField);
} else {
setText(getString());
setGraphic(getTreeItem().getGraphic());
}
}
}

private void createTextField() {
textField = new TextField(getString());
textField.setOnKeyReleased(new EventHandler<KeyEvent>() {

@Override
public void handle(KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(getDatabase(textField.getText()));
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
});
}

private Database getDatabase(String text) {
return new Database(text);
}

private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}

/**
*
* @param db
*/
public void setDatabase(Database db) {
TreeItem<Object> dbRoot = new TreeItem<>(db);
dbRoot.setExpanded(true);

db.getVariables().stream().forEach((var) -> {
dbRoot.getChildren().add(new TreeItem<>(var));
});

if (!root.getChildren().contains(dbRoot)) {
root.getChildren().add(dbRoot);
}
}

/**
*
* @param dbs
*/
public void setDatabases(List<Database> dbs) {
dbs.stream().forEach((db) -> {
setDatabase(db);
});
}
}

正如您所见,我的 TreeView 不是用 String 填充的,而是用我创建的对象填充的,并且是 Database ,这就是我使用 Object 的原因 类型。我认为我的问题来自于更新功能,但不知道为什么。

感谢您的阅读:)

最佳答案

startEdit()方法中,您需要将文本字段的文本设置为正确的值:

    @Override
public void startEdit() {
super.startEdit();

if (textField == null) {
createTextField();
}

textField.setText(getString());

setText(null);
setGraphic(textField);
textField.selectAll();
}

关于java - 编辑单元格时 TreeView 显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28795934/

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