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 -> {
// ...
});
在 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 -> {
// ...
});