2016-01-02 2 views
2

Для моего приложения я использую базу данных и вам нужно добавлять и удалять элементы в базе данных. У меня есть метод, в котором я делаю кнопку, видимую, когда вы выбрали элемент из списка, эта кнопка позволяет удалить элемент. Я использовал это уже 2 раза, но для следующего кода он не работает. Когда я отлаживаю его, я замечаю, что он идет дважды через мой if, и второй раз он говорит, что ничего не выбрано, поэтому он возвращает значение null.Почему это происходит дважды, если и возвращает значение 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

Похоже, что вы реализуете JList через IDE GUI Builder, как в NetBeans, например, и, очевидно, поймать ValueChanged событие, к сожалению (для Вашего случая), в действительности, огонь дважды, когда выбран элемент из списка , Это связано с тем, что список может быть многозадачным. Когда вы нажимаете левую кнопку мыши, событие запускается, а когда вы снова включаете левую кнопку мыши, событие снова срабатывает. Этот механизм предназначен для размещения getFirstIndex() (возвращает индекс первой строки, выбор которой может быть изменен) и getLastIndex() (возвращает индекс последней строки, чей выбор может быть изменен.) Методы ListSelectionEvent Класс.

Иногда этот двойной огонь удобен, но в вашем случае вы говорите, что хотите его только раз. Для этого необходимо добавить следующую строку кода в верхней части кода blocl в 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); 
    } 
} 

Смотрите JavaDoc идет о ListSelectionEvent класса здесь: https://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionEvent.html

Смежные вопросы