为什么它要经过两次 if 并在第二次返回 null?
Why does it go twice through if and gives back null the second time?
对于我的应用程序,我使用数据库并且需要在数据库中添加和删除项目。我有一个方法,当您从列表中选择一个项目时,我可以让一个按钮可见,这个按钮可以让您删除该项目。我已经使用了 2 次,但对于以下代码,它不起作用。当我调试它时,我注意到它通过我的 if 两次,第二次它说它没有选择任何东西所以它返回 null。
private void lstGenresValueChanged(javax.swing.event.ListSelectionEvent evt) {
Object geselecteerdeObject = lstGenres.getSelectedValue();
Genre geselecteerdGenre = (Genre) geselecteerdeObject;
if (geselecteerdeObject != null) {
txtGenreNaam.setText(geselecteerdGenre.getGenreNaam());
System.out.println(geselecteerdGenre.getGenreNaam());
ophalenGenresLijst();
}
if (lstGenres.isSelectionEmpty()) {
btnVerwijderen.setEnabled(false);
btnWijzigen.setEnabled(false);
} else {
btnVerwijderen.setEnabled(true);
btnWijzigen.setEnabled(true);
}
}
我也试着把它放在我的 if 中,但它没有改变任何东西
if (lstPersonen.getSelectedIndices().length == 0) {
不过这里确实有效
Object geselecteerdeObject = lstFilms.getSelectedValue();
Film geselecteerdeFilm = (Film) geselecteerdeObject;
if (geselecteerdeObject != null) {
String filmIdAlsString = Integer.toString(geselecteerdeFilm.getFilmId());
txtFilmNaam.setText(geselecteerdeFilm.getFilmNaam());
txtFilmJaar.setText(geselecteerdeFilm.getFilmJaar() + "");
txtAantalMinuten.setText(geselecteerdeFilm.getAantalMinuten() + "");
txtIMDbScore.setText(geselecteerdeFilm.getIMDbScore() + "");
updateGenreLijst(geselecteerdeFilm.getFilmId());
updateActeurLijst(geselecteerdeFilm.getFilmId());
updateRegisseurLijst(geselecteerdeFilm.getFilmId());
}
if (lstFilms.isSelectionEmpty()) {
btnVerwijderen.setEnabled(false);
btnWijzigen.setEnabled(false);
} else {
btnVerwijderen.setEnabled(true);
btnWijzigen.setEnabled(true);
}
我的猜测是,如果您取消注释 ophalenGenresLijst() 调用,它将起作用。似乎此调用正在影响您在上面更改了值的侦听器代码的列表。也许这里调用了错误的方法?
看起来您正在通过 IDE GUI Builder 实现 JList,例如在 NetBeans 中,显然捕获了 valueChanged 事件,不幸的是(对于您的情况)当从列表中选择一个项目时,它实际上会触发两次。这是因为列表可以是 multi-selectable。当您按下鼠标左键时会触发该事件,然后当您再次松开鼠标左键时该事件会再次触发。此机制是为了适应 getFirstIndex()(returns 其选择可能已更改的第一行的索引)和 getLastIndex()(returns 其选择可能已更改的最后一行的索引。)ListSelectionEvent Class.
的方法
有时这种双重火力很方便,但在你的情况下你说你只想要一次。为此,您需要将以下代码行添加到 valueChanged 事件中代码块的顶部:
if (evt.getValueIsAdjusting()) { return; }
这将强制您在按下鼠标时退出事件,但允许在松开鼠标按钮时触发事件。如果你想要相反的效果,而事件允许在按下鼠标左键时触发但在再次松开鼠标键时不触发,那么将代码行更改为:
if (!evt.getValueIsAdjusting()) { return; }
您的活动代码应如下所示:
private void lstGenresValueChanged(javax.swing.event.ListSelectionEvent evt) {
if (!evt.getValueIsAdjusting()) { return; } // ONLY FIRE ON MOUSE DOWN
Object geselecteerdeObject = lstGenres.getSelectedValue();
Genre geselecteerdGenre = (Genre) geselecteerdeObject;
if (geselecteerdeObject != null) {
txtGenreNaam.setText(geselecteerdGenre.getGenreNaam());
System.out.println(geselecteerdGenre.getGenreNaam());
ophalenGenresLijst();
}
if (lstGenres.isSelectionEmpty()) {
btnVerwijderen.setEnabled(false);
btnWijzigen.setEnabled(false);
} else {
btnVerwijderen.setEnabled(true);
btnWijzigen.setEnabled(true);
}
}
在此处查看关于 ListSelectionEvent Class 的 JavaDoc:https://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionEvent.html
对于我的应用程序,我使用数据库并且需要在数据库中添加和删除项目。我有一个方法,当您从列表中选择一个项目时,我可以让一个按钮可见,这个按钮可以让您删除该项目。我已经使用了 2 次,但对于以下代码,它不起作用。当我调试它时,我注意到它通过我的 if 两次,第二次它说它没有选择任何东西所以它返回 null。
private void lstGenresValueChanged(javax.swing.event.ListSelectionEvent evt) {
Object geselecteerdeObject = lstGenres.getSelectedValue();
Genre geselecteerdGenre = (Genre) geselecteerdeObject;
if (geselecteerdeObject != null) {
txtGenreNaam.setText(geselecteerdGenre.getGenreNaam());
System.out.println(geselecteerdGenre.getGenreNaam());
ophalenGenresLijst();
}
if (lstGenres.isSelectionEmpty()) {
btnVerwijderen.setEnabled(false);
btnWijzigen.setEnabled(false);
} else {
btnVerwijderen.setEnabled(true);
btnWijzigen.setEnabled(true);
}
}
我也试着把它放在我的 if 中,但它没有改变任何东西
if (lstPersonen.getSelectedIndices().length == 0) {
不过这里确实有效
Object geselecteerdeObject = lstFilms.getSelectedValue();
Film geselecteerdeFilm = (Film) geselecteerdeObject;
if (geselecteerdeObject != null) {
String filmIdAlsString = Integer.toString(geselecteerdeFilm.getFilmId());
txtFilmNaam.setText(geselecteerdeFilm.getFilmNaam());
txtFilmJaar.setText(geselecteerdeFilm.getFilmJaar() + "");
txtAantalMinuten.setText(geselecteerdeFilm.getAantalMinuten() + "");
txtIMDbScore.setText(geselecteerdeFilm.getIMDbScore() + "");
updateGenreLijst(geselecteerdeFilm.getFilmId());
updateActeurLijst(geselecteerdeFilm.getFilmId());
updateRegisseurLijst(geselecteerdeFilm.getFilmId());
}
if (lstFilms.isSelectionEmpty()) {
btnVerwijderen.setEnabled(false);
btnWijzigen.setEnabled(false);
} else {
btnVerwijderen.setEnabled(true);
btnWijzigen.setEnabled(true);
}
我的猜测是,如果您取消注释 ophalenGenresLijst() 调用,它将起作用。似乎此调用正在影响您在上面更改了值的侦听器代码的列表。也许这里调用了错误的方法?
看起来您正在通过 IDE GUI Builder 实现 JList,例如在 NetBeans 中,显然捕获了 valueChanged 事件,不幸的是(对于您的情况)当从列表中选择一个项目时,它实际上会触发两次。这是因为列表可以是 multi-selectable。当您按下鼠标左键时会触发该事件,然后当您再次松开鼠标左键时该事件会再次触发。此机制是为了适应 getFirstIndex()(returns 其选择可能已更改的第一行的索引)和 getLastIndex()(returns 其选择可能已更改的最后一行的索引。)ListSelectionEvent Class.
的方法有时这种双重火力很方便,但在你的情况下你说你只想要一次。为此,您需要将以下代码行添加到 valueChanged 事件中代码块的顶部:
if (evt.getValueIsAdjusting()) { return; }
这将强制您在按下鼠标时退出事件,但允许在松开鼠标按钮时触发事件。如果你想要相反的效果,而事件允许在按下鼠标左键时触发但在再次松开鼠标键时不触发,那么将代码行更改为:
if (!evt.getValueIsAdjusting()) { return; }
您的活动代码应如下所示:
private void lstGenresValueChanged(javax.swing.event.ListSelectionEvent evt) {
if (!evt.getValueIsAdjusting()) { return; } // ONLY FIRE ON MOUSE DOWN
Object geselecteerdeObject = lstGenres.getSelectedValue();
Genre geselecteerdGenre = (Genre) geselecteerdeObject;
if (geselecteerdeObject != null) {
txtGenreNaam.setText(geselecteerdGenre.getGenreNaam());
System.out.println(geselecteerdGenre.getGenreNaam());
ophalenGenresLijst();
}
if (lstGenres.isSelectionEmpty()) {
btnVerwijderen.setEnabled(false);
btnWijzigen.setEnabled(false);
} else {
btnVerwijderen.setEnabled(true);
btnWijzigen.setEnabled(true);
}
}
在此处查看关于 ListSelectionEvent Class 的 JavaDoc:https://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionEvent.html