Используйте TreeSet для сортировки JList
Я делаю задание, в котором я создаю программу, которая генерирует 20 случайных чисел и помещает их в массив, хэш-набор и набор деревьев. Предполагается показать эти цифры в JList1. Затем я собираюсь использовать HashSet для отображения только уникальных чисел и TreeSet для отображения отсортированных чисел. Я создал три JList и создал для каждого из них одну функцию для обновления GUI (возможно, есть более простой способ сделать это, но это все, что я мог придумать, потому что я совсем новичок в Java). Так, например, моя функция updateGUI, используемая для отображения массива в моем JList, выглядит следующим образом:
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 - это имя моего массива.
Я сделал почти то же самое для HashSet, чтобы отобразить JList с уникальными номерами, и это сработало. Однако затем я попытался сделать то же самое для TreeSet, что дало мне ошибку "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException". Функция выглядит так:
public void oppdaterGUI3(JList someList, TreeSet<Integer> anysortedlist){
DefaultListModel m = new DefaultListModel();
for (Object s : anysortedlist) {
m.addElement(s);
}
someList.setModel(m);
}
Почему это не работает? Я думал, что TreeSet будет работать так же, как HashSet. Любая помощь приветствуется. Я могу опубликовать полную ошибку и код, если это необходимо.
Спасибо.
1 ответ
Я формулирую следующее как ответ, хотя информация отсутствует.
Посмотрите на трассировку стека NullPointerException. Это дает номер строки, где это произошло.
Возможно, TreeSet определен дважды, один раз как локальная переменная. Или есть один случай, когда копия набора деревьев тоже должна была произойти. Что-то вроде того.
Вы можете отладить его, используя точки останова. Пройдите по всем видам использования дерева set var и еще одного var.
Для немного более отзывчивого графического интерфейса используйте следующий шаблон.
@Override
public void actionPerformed(ActionEvent arg0) {
EventQueue.invokeLater(new Runnable()) {
@Override
public void run() {
generateNumbers();
/*MyClass.this.*/ updateGUI(this.numbers1, numberlist);
}
});
}