2012-06-02 2 views
0

Следующий код находится в процессе выполнения:Вызов метода JList из потока

private final Controller controller = new Controller(); 
private final XSimpleList lists[] = new XSimpleList[2]; //extends JList (my framework) 

У меня есть класс X общественности, которая простирается JFrame и реализует Runnable. Этот открытый класс X имеет определенный конструктор. Последняя строка в конструкторе:

(new Thread(new X())).start(); 

В случае необходимости я есть public void run() {}. В этом методе Run() У меня есть

lists[0].FillUp(controller.getSomeData(), 2); 

Нить запрограммирована для выполнения указанной выше линии, когда он получил сообщения от UdP сервера. Итак ... проблема в том, когда данная строка выполняется (время выполнения). В результате получается java.lang.NullPointerException.

XSimpleList сегменты кода:

final JList hW; 
final DefaultListModel dlm; 
final JScrollPane lsp; 

public final void FillUp(MyTypeRepository volume, int filter) { 
    dlm.clear(); 
    //iterations 
    dlm.addElement(some_data); 
    //end iterations 
} 

Мой вопрос ... Как я могу решить эту проблему, с тем, что списков [0] не возвращать эту NullPointer при вызове из запущенной темы?

При выполнении (только) из класса X вопрос отсутствует. Я считаю, что проблема заключается в совместном использовании данных между двумя «трубами», что означает родительский экземпляр (класс x) и дочерний экземпляр (поток y).

Спасибо!

+0

Вы настроили массив 'lists' в любом месте, т. Е.' List [0] = new XSimpleList() '? – Howard

+0

Да, все сделано правильно ... единственная проблема в том, что он выбрасывает этот нулевой указатель, когда метод вызывается из потока ... – user1432223

+2

Независимо от причины, ваш дизайн должен быть полностью изменен, поскольку компоненты Swing и их модель должны доступ к ним только из потока отправки событий. Прочтите http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ и http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading (который связан с javadoc каждого компонента качания) –

ответ

1
lists[0] has NULL because 
private final XSimpleList lists[] = new XSimpleList[2] creates an array with NULL values Like: 
    lists[0] = NULL; 
    lists[1] = NULL; 

You should write code as: 
private final XSimpleList lists[] = new XSimpleList[2]; 
lists[0] = new XSimpleList(); 
lists[1] = new XSimpleList(); 
+0

Это правильный ответ на вопрос OP (поведение инициализации массива). Rhere - гораздо большая проблема, когда он пытается взаимодействовать с компонентом Swing из потока, отличного от EDT, но я думаю, что комментарии достаточно хорошо охватывают. –

+0

массив инициализируется как списки [0] = новый XSimpleList(); в конструкторе. проблема должна быть связана с «попыткой взаимодействия с компонентом Swing из потока, отличного от EDT». – user1432223

Смежные вопросы