【发布时间】: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