为什么它会两次通过并且第二次返回null?

时间:2016-01-02 12:21:39

标签: java if-statement netbeans jlist

对于我的应用程序,我使用数据库,需要在数据库中添加和删除项目。我有一个方法,当您从列表中选择一个项目时,我可以看到一个按钮,此按钮允许您删除该项目。我已经使用过2次但是对于下面的代码它不起作用。当我调试它时,我注意到它在我的if中出现两次,第二次它表示它没有选择任何内容因此它让我返回null。

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);
        }

我也尝试把它放在我的if中,但它不会改变任何东西

while (true)
{
    recv(server, buffer, BUFFER_LENGTH, 0);
    cout << buffer;
}

但是这里确实有效

while (true)
{
    cin >> buffer;
    send(client, buffer, BUFFER_LENGTH, 0);
}

2 个答案:

答案 0 :(得分:1)

我的猜测是,如果您取消注释ophalenGenresLijst()调用它将起作用。似乎此调用正在影响您在其上具有值更改的侦听器代码的列表。也许在这里调用错误的方法?

答案 1 :(得分:1)

看起来您正在通过IDE GUI Builder实现JList,例如在NetBeans中,并且很明显地捕获了 valueChanged 事件,不幸的是(对于您的情况)事件确实会在项目发生时触发两次从列表中选择。这是因为列表可以是多选的。当您单击鼠标左键时,事件被触发,然后当您再次按下鼠标左键时,事件再次触发。此机制适用于 getFirstIndex()(返回其选择可能已更改的第一行的索引)和 getLastIndex()(返回最后一行的索引)其选择可能已经改变。) ListSelectionEvent 类的方法。

有时这种双重射击很方便,但在你的情况下,你说你只想要它一次。为此,您需要在 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 类的JavaDoc:https://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionEvent.html