为什么它要经过两次 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