【问题标题】:JList NullPointerException in valueChanged operationvalueChanged 操作中的 JList NullPointerException
【发布时间】:2015-05-01 18:59:40
【问题描述】:

这是我的第一个 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 行“

if (value.length() > 0){

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

【问题讨论】:

  • 错的是value为null,表示没有选中的值。在调用它的方法之前检查它不为空。也可以使用docs.oracle.com/javase/7/docs/api/javax/swing/event/…,在调整值时不要做任何事情。
  • 当我在同一个 jlist 中的项目之间切换时显示正常,但当我在两个 JList 中选择一个项目然后尝试更改第一个 jlist 中的项目时就不行了。@JBNizet

标签: java swing nullpointerexception jlist


【解决方案1】:

在选择更改期间,当前选定的项目被“取消选择”,这意味着暂时没有选择任何内容,ListSelectionListeners 会收到此更改的通知,这是您的 null 值的来源.

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

您可以通过使用ListSelectionEvent#getValueIsAdjusting对此进行测试

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

【讨论】:

  • 但我在两个 jlist 中都使用 isSelectionEmpty() 对它们进行了测试,都返回 false。
  • 测试事件以确保选择过程未处于突变状态,JList 可能实际上还不知道选择已更改。使用最准确的信息,事件信息
  • 另一种可能是您尝试从中获取信息的JList 不是屏幕上的JList...
  • 你的意思是对于两个 JList ,如果我在一个 Jlist 中进行选择,那么之前在另一个 Jlist 中的选择会被取消选择?那么如何让其他 JList 保持选中状态呢?
  • 不,这只是一个JList,即事件的source,在大多数情况下,更改选择会引发两个事件,一个DESELECT 和一个SELECT 事件单JList...
猜你喜欢
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2013-11-01
  • 1970-01-01
  • 2011-04-18
  • 2012-09-09
  • 2023-03-07
相关资源
最近更新 更多