2015-03-01 2 views
0

вот мой первый JList:JList NullPointerException в эксплуатации ValueChanged

JPanel classe = new JPanel(); 
class_list = new JList(); 
class_list.addListSelectionListener(this); 
JScrollPane classeScrollPane = new JScrollPane(class_list); 
classeScrollPane.setPreferredSize(new Dimension(175,405)); 
classe.setBorder(new TitledBorder("Classes")); 
classe.add(classeScrollPane); 

вот второй:

JPanel relation = new JPanel(); 
relation_list = new JList(); 
relation_list.addListSelectionListener(this); 
JScrollPane relationScrollPane = new JScrollPane(relation_list); 
relationScrollPane.setPreferredSize(new Dimension(220,130)); 
relation.setBorder(new TitledBorder("Relations")); 
relation.add(relationScrollPane); 

вот моя работа ValueChanged:

public void valueChanged(ListSelectionEvent e){ 
    JList source = (JList) e.getSource(); 
    String value = (String)source.getSelectedValue(); 
    if (value.length() > 0){ 
     if (source == class_list){ 
      //if(!relation_list.isSelectionEmpty()) relation_list.clearSelection(); 
      Class_object co = declaration.getClass(value); 
      attribut_list.setListData(co.getAttributes().toArray()); 
      operation_list.setListData(co.getOperations().toArray()); 
      if(declaration.getGeneralization(value) !=null){ 
       subClass_list.setListData(declaration.getGeneralization(value).getSubClasses().toArray()); 
      } 
      //clear JList if there is no correspondent subclass 
      else subClass_list.setListData(new String[2]); 
      //add relation content to relation panel 
      DefaultListModel model = new DefaultListModel(); 
      related_association = declaration.getAssociation(value); 
      for(Association asso : related_association){ 
       model.addElement("(R)"+asso.getName()); 
      } 
      related_aggregation = declaration.getAggregation(value); 
      for(Aggregation agg : related_aggregation){ 
       model.addElement("(A)"+agg.getName()); 
      } 
      relation_list.setModel(model); 
     } 
     if (source == relation_list){ 
      int focused_list = source.getSelectedIndex(); 
      if(focused_list < related_association.size()){ 
       details.setText(related_association.get(focused_list).toString()); 
      } 
      else { 
       details.setText(related_aggregation.get(focused_list-related_association.size()).toString()); 
      } 
     } 
    } 
} 

В основном, когда мы щелкните элемент в первом JList, он отображает во втором JList что-то (например, имя переменной этого элемента). Затем мы нажимаем на элемент во втором JList, он отображает больше информации об этом элементе в JTextArea. Таким образом, вы должны щелкнуть первый jlist для отображения второго jlist, затем щелкнуть второй jlist, чтобы отобразить подробную информацию. Вот проблема, после того, как я нажал первый JList и второй JList, я нажимаю еще один пункт в первом JList, NullPointerException происходит в строке "

если (value.length()> 0) {

Я понимаю, что ошибка происходит потому, что значение переменной равно нулю, но я не знаю, почему значение равно нулю. Может кто-нибудь сказать мне, что случилось с моим кодом. Большое спасибо.

+0

Что неправильным является то, что значение равно null, что означает, что нет выбранного значения. Проверьте, что он не равен нулю, прежде чем вызывать метод на нем. Также используйте http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionEvent.html#getValueIsAdjusting%28%29 и ничего не делайте, пока значение корректируется. –

+0

Дисплей в порядке, когда я переключаюсь между элементами в том же jlist, но не нормально, когда я выбрал элемент в JList, а затем попытаюсь изменить элемент в первом jlist. @ JBNizet – BroLegend

ответ

1

при изменении выбора , текущий выбранный элемент «отменен», это означает, что на мгновение ничего не происходит выбрано, ListSelectionListener с уведомлены об этом изменении, это - то, откуда исходит ваше значение null.

Затем выбор будет изменен на вновь выбранный элемент, а ListSelecitonListener s будут уведомлены снова.

Вы можете проверить это с помощью использования ListSelectionEvent#getValueIsAdjusting

Причина это происходит во второй раз, когда вы выберите значение потому, что уведомление Отмена выбора событий не происходит, только событие выбора ...

+0

, но я протестировал их с помощью isSelectionEmpty() в обоих jlist, оба возвращают false. – BroLegend

+0

Проверьте событие, чтобы убедиться, что процесс выбора не находится в состоянии мутации, возможно, что 'JList' пока не знает, что выбор изменился. Используйте самую точную информацию, информацию о событии – MadProgrammer

+0

Другая возможность заключается в том, что 'JList', с которой вы пытаетесь получить информацию, не является' JList', который находится на экране ... – MadProgrammer

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