gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:54:20 24 4
gpt4 key购买 nike

在JavaFX TreeView中,我正在使用扩展TreeItem的“自定义”类。这使我能够在TreeView中编辑项目(我可以双击它们并在运行应用程序时编辑内容),但似乎无法正确设置.setOnEditCommit()方法。我希望它的工作方式类似于表 View 中的功能,但是我还没有运气。

这是我在 Controller 中尝试设置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);
}
});
}

这就是我的“自定义”类的样子。
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;
}
}

第二级“下级”
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 -> {

// ...

});

关于javafx - JavaFX-在lambda中使用TreeView.EditEvent的参数类型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185468/

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