2016-01-02 44 views
2

對於我的應用程序,我使用一個數據庫並需要添加和刪除項目到數據庫中。我有一種方法,當您從列表中選擇一個項目時,使按鈕變爲可見,此按鈕允許您刪除該項目。我已經使用過這2次,但對於下面的代碼它不起作用。當我調試它時,我注意到它在兩次通過我的if和第二次它說它沒有選中,所以它讓我回到空。爲什麼它會兩次通過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 (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); 
     } 

回答

1

我的猜測是,它會工作,如果您取消註釋ophalenGenresLijst()調用。看起來這個調用正在影響你在上面改變了值監聽器代碼的列表。也許在這裏調用錯誤的方法?

+0

感謝你,確實是問題,這是不是錯了方法,但我把它叫做上 錯誤的地方。我不認爲這會影響它,但非常感謝。 –

+1

太棒了!你的第二個小建議如果:boolean hasSelection =!lstGenres.isSelectionEmpty; btnVerwijderen.setEnabled(hasSelection); btnWijzigen.setEnabled(hasSelection);我發現它更具可讀性。 –

1

看起來要實現通過IDE GUI構建器一個JList,如在NetBeans例如,顯然趕的valueChanged事件,不幸的是(你的情況)是否確實火的時候兩次項目從列表中選擇。這是因爲該列表可以是多選的。當你點擊鼠標左鍵時,事件被觸發,當你再次點擊鼠標左鍵時,事件再次觸發。這種機制是爲了容納getFirstIndex()(返回其選擇可能已經改變的第一行的索引)和getLastIndex()(返回其選擇可能已經改變的最後一行的索引)。 ListSelectionEvent Class。

有時這雙火是方便的,但在你的情況下,你說你只是想要一次。要做到這一點,你要的的valueChanged事件中下面的代碼行添加到您的代碼blocl的頂部:

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

見JavaDoc中的有關ListSelectionEvent類在這裏:https://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionEvent.html

相關問題