valueChanged操作中的JList NullPointerException

时间:2015-03-01 10:43:17

标签: java swing nullpointerexception jlist

这是我的第一个JList:

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出现在行#34;

  

if(value.length()&gt; 0){

我理解错误的发生是因为变量值为null,但我不知道为什么value为null。 谁能告诉我我的代码有什么问题。非常感谢。

1 个答案:

答案 0 :(得分:1)

在选择更改期间,“取消选择”当前所选项目,这意味着,暂时不会选择任何内容,ListSelectionListener会收到此更改的通知,这是您null的位置价值来自。

然后选择更改为新选择的项目,并再次通知ListSelecitonListener

您可以使用ListSelectionEvent#getValueIsAdjusting

进行测试

第二次选择值时发生这种情况的原因是因为取消选择事件通知没有发生,只有选择事件......