Я пытаюсь динамически обновлять JComboBox в приложении Swing и получаю исключение нулевого указателя.
class Accounts extends JPanel {
JComboBox<String> accountSelect;
DefaultComboBoxModel accountSelectModel;
public Accounts() {
this.initGUI();
}
public void initGUI() {
//setLayout etc...
String[] al = {};//start empty
this.accountSelectModel = new DefaultComboBoxModel(al);
this.accountSelect = new JComboBox<String>();
this.accountSelect.setModel(accountSelectModel);
this.add(this.accountSelect);
}
public void updateComboBox(String[] al) {
//clear items and apply new
this.accountSelectModel = new DefaultComboBoxModel(al);
this.accountSelect.setModel(this.accountSelectModel);
}
public void removeComboBoxItems() {
//A call HERE here resorts in a null exception pointer ???
this.accountSelectModel.removeAllElements();
}
}
Спасибо за любой отзыв.
ОБНОВИТЬ
Разобрался с проблемой. Сначала я был уверен, что проблема не в этом (извините, что не указал этот код).
Сначала я добавлял слушателя через addActionListener (внутри учетных записей) в поле со списком accountSelect.
this.accountSelect.addActionListener(new AcountActionListener);
class AcountSelectListener implements ActionListener {
void actionPerformed(ActionEvent e) P
//Object source etc..
if(source == accountSelect) {
//etc...
selectAccount(item);
}
}
}
Вместо этого я делаю:
class Accounts extends JPanel implements ActionListener
и переопределение метода actionPerformed внутри Accounts.
это решило мою проблему...
ОБНОВЛЕНИЕ 2
Однако я бы предпочел (а также то, что рекомендовали другие), мне не нужно создавать весь класс Accounts ActionListener.
Итак, я перешел к оригиналу и обнаружил, что проблема заключается в том, что каждый вызов this.accountSelectModel.removeAllElements запускает действие во внутреннем прослушивателе AccountSelectListener, которое добавляется к this.accountSelect.
Слушатель должен был установить новый параметр поля со списком, но поскольку он не вызывался во время изменения выбора (но при удаленииAllElements), источник объекта (элемент) был нулевым, который при передаче вызывал NPE.
removeComboBoxItems()
. Он вызывает его для действительного экземпляра Accounts? Кроме того, рассмотрите возможность использования немного меньшего количестваthis
. Это может сделать ваш код излишне многословным.\ - person Hovercraft Full Of Eels   schedule 04.05.2013null
, основываясь на приведенном выше коде? Значение по умолчанию —null
; Я предполагаю, что созданиеAccounts
в начальном потоке i> будет участвовать в гонке слушателя, работающего на EDT. Более того,initGUI()
этоpublic
и его можно вызывать в любое время. - person trashgod   schedule 05.05.2013