JavaFX - 与在 lambda 中使用 TreeView.EditEvent 不兼容的参数类型

JavaFX - Incompatible parameter type with using TreeView.EditEvent in lambda

在 JavaFX TreeView 中,我使用 'custom' classes 扩展 TreeItem。这使我能够编辑 TreeView 中的项目(我可以双击它们并在 运行 应用程序时编辑内容)但我似乎无法正确设置 .setOnEditCommit() 方法。我希望它能像 tableview 中的函数一样工作,但我还没有运气。

这是我在我的控制器中尝试设置 setOnEditCommit() 方法的代码。在我的名为 'trvDivisies' 的 TreeView 中,我显示了足球队的分区/比赛,在下一级我显示了某个分区中的所有球队。

private void setUpTreeView() {
    trvDivisies.setEditable(true);
    trvDivisies.setShowRoot(false);

    TreeItem<String> root = new TreeItem<>();

    for (Divisie d : divisies) {
        TreeItem<String> divisieTreeItem = d;
        divisieTreeItem.valueProperty().set(d.getNaam());

        for (VoetbalTeam vt : d.getVoetbalTeams()) {
            TreeItem<String> voetbalTeamTreeItem = vt;
            voetbalTeamTreeItem.valueProperty().setValue(vt.getTeamNaam());
            divisieTreeItem.getChildren().add(voetbalTeamTreeItem);
        }

        root.getChildren().add(divisieTreeItem);
    }

    trvDivisies.setRoot(root);

    trvDivisies.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
        @Override
        public void changed(ObservableValue observable, Object oldValue, Object newValue) {
            System.out.println(newValue);
        }
    });

    trvDivisies.setCellFactory(TextFieldTreeCell.forTreeView());
    // I get an error at the following line when compiling
    trvDivisies.setOnEditCommit((TreeView.EditEvent p) -> {
        TreeItem<String> selectedItem = p.getTreeItem();
        if (selectedItem instanceof Divisie) {
            updateDivisie((Divisie)selectedItem);
        } else if (selectedItem instanceof VoetbalTeam) {
            updateTeam((VoetbalTeam)selectedItem);
        }
    });
}

这就是我的 'custom' class 的样子。

public class Divisie extends TreeItem<String> {
private static int idCount = 0;

private int id;
private String naam;
private List<VoetbalTeam> voetbalTeams;

public int getId() {
    return id;
}

public String getNaam() {
    return naam;
}

public List<VoetbalTeam> getVoetbalTeams() {
    return voetbalTeams;
}

public Divisie(int id, String naam) {
    super(naam);
    this.id = id;
    this.naam = naam;
}

public Divisie(String naam) {
    this.id = ++idCount;
    this.naam = naam;
}

public void addTeam(VoetbalTeam toBeAdded) {
    if (voetbalTeams == null) {
        voetbalTeams = new LinkedList<>();
    }
    voetbalTeams.add(toBeAdded);
}

@Override
public String toString() {
    return this.naam;
}
}

第二个'lower level'class

public class VoetbalTeam extends TreeItem<String> {
private static int idCount = 0;

private int id;
private String teamNaam;
private List<Speler> spelers;

public int getId() {
    return id;
}

public String getTeamNaam() {
    return teamNaam;
}

public List<Speler> getSpelers() {
    return this.spelers;
}

public VoetbalTeam(int id, String teamNaam) {
    super(teamNaam);
    this.id = id;
    this.teamNaam = teamNaam;
}

public VoetbalTeam(String teamNaam) {
    super(teamNaam);
    this.id = ++idCount;
    this.teamNaam = teamNaam;
}

public void addSpeler(Speler nieuweSpeler) {
    if (spelers == null) {
        spelers = new LinkedList<>();
    }
    this.spelers.add(nieuweSpeler);
}

@Override
public String toString() {
    return this.teamNaam;
}
}

当尝试使用 .setOnEditCommit() 方法 运行 应用程序时,我收到一条错误消息:

Error:(97, 37) java: incompatible types: incompatible parameter types in lambda expression

我希望你们能告诉我我需要将 TreeView.EditEvent lambda 更改为什么,或者帮助我找到更简单的解决方案。

对于TreeView<T>setOnEditCommit的签名是

void setOnEditCommit(EventHandler<TreeView.EditEvent<T>> value)

既然你有(显然)TreeView<String>,你需要

trvDivisies.setOnEditCommit((TreeView.EditEvent<String> p) -> {

    // ...

});

或者,当然,您可以让编译器为您完成工作:

trvDivisies.setOnEditCommit(p -> {

    // ...

});