我正在做一个任务,我正在创建一个生成20个随机数的程序,并将它们放在arraylist,hashset和treeset中。它应该在JList1中显示这些数字。然后,我将使用HashSet仅显示唯一的数字,并使用TreeSet显示已排序的数字。我制作了三个JLists,并为每个JLists创建了一个更新GUI的功能(可能有一种更简单的方法可以做到这一点,但由于我对java很新,所以我只能想出来)。所以,例如我用于在我的JList中显示arraylist的updateGUI函数如下所示:
public void updateGUI(JList someList, ArrayList<Integer> anyarraylist){
DefaultListModel m = new DefaultListModel();
for (Object s : anyarraylist) {
m.addElement(s);
}
someList.setModel(m);
}
然后当我使用ActionEvent按下按钮时调用该函数:
@Override
public void actionPerformed(ActionEvent arg0) {
generateNumbers();
this.updateGUI(this.numbers1, numberlist);
其中generateNumbers是我生成20个随机数的函数,numbers1是我的第一个JList,numberlist是我的arraylist的名字。
我为HashSet做了几乎完全相同的事情,以显示具有唯一数字的JList,并且它有效。但是,我接着尝试对TreeSet执行相同的操作,这给了我一个“线程中的异常”AWT-EventQueue-0“java.lang.NullPointerException”-error。该函数如下所示:
public void oppdaterGUI3(JList someList, TreeSet<Integer> anysortedlist){
DefaultListModel m = new DefaultListModel();
for (Object s : anysortedlist) {
m.addElement(s);
}
someList.setModel(m);
}
为什么这不起作用?我认为TreeSet的工作方式与HashSet相同。任何帮助表示赞赏。如有必要,我可以发布完整的错误和代码。
谢谢。
答案 0 :(得分:1)
我提出以下答案,但缺乏信息。
查看NullPointerException的stacktrace。它给出了它发生的行号。
可能是TreeSet定义了两次,一次是局部变量。或者有一种情况是树集的副本也必须发生。这样的事情。
您可以使用断点对其进行调试。遍历树集var和其他一个var的所有用法。
对于响应速度更快的GUI,请使用以下模式。
@Override
public void actionPerformed(ActionEvent arg0) {
EventQueue.invokeLater(new Runnable()) {
@Override
public void run() {
generateNumbers();
/*MyClass.this.*/ updateGUI(this.numbers1, numberlist);
}
});
}