gpt4 book ai didi

单击单元格进行编辑时,JavaFX 8 TreeView 显示不正确的字符串

转载 作者:行者123 更新时间:2023-12-01 11:44:24 25 4
gpt4 key购买 nike

我使用来自 Oracle 的以下代码:

import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Callback;

import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.VBox;

public class TreeViewSample extends Application {

List<Employee> employees = Arrays.<Employee>asList(
new Employee("Ethan Williams", "Sales Department"),
new Employee("Emma Jones", "Sales Department"),
new Employee("Michael Brown", "Sales Department"),
new Employee("Anna Black", "Sales Department"),
new Employee("Rodger York", "Sales Department"),
new Employee("Susan Collins", "Sales Department"),
new Employee("Mike Graham", "IT Support"),
new Employee("Judy Mayer", "IT Support"),
new Employee("Gregory Smith", "IT Support"),
new Employee("Jacob Smith", "Accounts Department"),
new Employee("Isabella Johnson", "Accounts Department"));
TreeItem<String> rootNode =
new TreeItem<String>("MyCompany Human Resources");

public static void main(String[] args) {
Application.launch(args);
}

@Override
public void start(Stage stage) {
rootNode.setExpanded(true);
for (Employee employee : employees) {
TreeItem<String> empLeaf = new TreeItem<String>(employee.getName());
boolean found = false;
for (TreeItem<String> depNode : rootNode.getChildren()) {
if (depNode.getValue().contentEquals(employee.getDepartment())){
depNode.getChildren().add(empLeaf);
found = true;
break;
}
}
if (!found) {
TreeItem depNode = new TreeItem(employee.getDepartment());
rootNode.getChildren().add(depNode);
depNode.getChildren().add(empLeaf);
}
}

stage.setTitle("Tree View Sample");
VBox box = new VBox();
final Scene scene = new Scene(box, 400, 300);
scene.setFill(Color.LIGHTGRAY);

TreeView<String> treeView = new TreeView<String>(rootNode);
treeView.setEditable(true);
treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
@Override
public TreeCell<String> call(TreeView<String> p) {
return new TextFieldTreeCellImpl();
}
});

box.getChildren().add(treeView);
stage.setScene(scene);
stage.show();
}

private final class TextFieldTreeCellImpl extends TreeCell<String> {

private TextField textField;
private ContextMenu addMenu = new ContextMenu();

public TextFieldTreeCellImpl() {
MenuItem addMenuItem = new MenuItem("Add Employee");
addMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(new EventHandler() {
public void handle(Event t) {
TreeItem newEmployee =
new TreeItem<String>("New Employee");
getTreeItem().getChildren().add(newEmployee);
}
});
}

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

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

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

setText((String) getItem());
setGraphic(getTreeItem().getGraphic());
}

@Override
public void updateItem(String 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());
if (
!getTreeItem().isLeaf()&&getTreeItem().getParent()!= null
){
setContextMenu(addMenu);
}
}
}
}

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

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

}

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

public static class Employee {

private final SimpleStringProperty name;
private final SimpleStringProperty department;

private Employee(String name, String department) {
this.name = new SimpleStringProperty(name);
this.department = new SimpleStringProperty(department);
}

public String getName() {
return name.get();
}

public void setName(String fName) {
name.set(fName);
}

public String getDepartment() {
return department.get();
}

public void setDepartment(String fName) {
department.set(fName);
}
}
}

此代码生成一个带有非常基本的、可编辑的 TreeView 的 GUI。但是,当单击填充树的单元格时,最终用于编辑的文本字段将开始显示不正确的信息(树中包含的信息,但不由正在编辑的单元格表示)。我不明白为什么会发生这种情况,而且我还没有在 Google 或 StackOverflow 上的其他地方找到任何发生这种情况的引用。如果有人能帮助我理解为什么会发生这种情况,我会非常高兴。

谢谢!

最佳答案

我检查了你的申请,只发现了一件奇怪的事情。当您创建编辑文本字段一次后,未保存的信息稍后将在该文本字段中可见。

这个修改可以解决这个问题:

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

this.setText(this.getItem());
this.textField.setText(this.getItem());
this.setGraphic(this.getTreeItem().getGraphic());
}

关于单击单元格进行编辑时,JavaFX 8 TreeView 显示不正确的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29271637/

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