2012-02-13 3 views
1

Я работаю над проектом, который требует GUI, но у меня нет опыта работы с графическим интерфейсом, поэтому все, что я делаю, - это догадки в некотором смысле. У меня есть arraylist объектов, которые я поместил в JList, и теперь я пытаюсь изменить текст в метке на основе того, что пользователь выбирает. Я получаю сообщение об ошибке: «не может относиться к неконечной переменной библиотеке внутри внутреннего класса, определенный в другом методе»JLists с Arraylists?

ArrayList Я использую заселен с объектами, которые я могу назвать строки из

Как мне заставить это работать?

JList list = new JList(bookNames.toArray()); 

list.addListSelectionListener(new ListSelectionListener() { 
    public void valueChanged(ListSelectionEvent event) { 
     typeLabel.setText(library.get(list.getSelectedIndex()).getType()); 
    } 
}); 
+0

Если это должно быть окончательным, то как сделать, чтобы мой аррайалист заполнил его правильно? – Ligerx

+0

содержимое вашего списка все равно может измениться, даже если оно объявлено «окончательным» - вы просто не можете присвоить другое значение переменной «list» – alex

+0

THANKS GUYS Я получил его! Теперь просто чтобы скопировать мой код пару раз, и это полукомплексный проект! – Ligerx

ответ

1

Вы не можете получить доступ к переменной typeLabel внутри вашего нового ListSelectionListener() {...}.

JList list = new JList(bookNames.toArray()); 

list.addListSelectionListener(new ListSelectionListener() { 
    public void valueChanged(ListSelectionEvent event) { 
     // you cannot access typeLabel here 
     typeLabel.setText(library.get(list.getSelectedIndex()).getType()); 
    } 
}); 

Быстрое исправление заключается в объявлении типаLabel как окончательного. Это означает, что вы не можете переназначить другое значение для typeLabel, но это, вероятно, хорошо.

final typeLabel = whatever; // add the final modifier 

final JList list = new JList(bookNames.toArray()); 

list.addListSelectionListener(new ListSelectionListener() { 
    public void valueChanged(ListSelectionEvent event) { 
     typeLabel.setText(library.get(list.getSelectedIndex()).getType()); 
    } 
}); 

редактировать: Кроме того, список должен быть объявлен окончательным.

0

Ссылка на JList list должен быть final.

final JList list = new JList(...) 

final ключевое слово в Java имеет несколько значений. При использовании с переменной или полем это означает, что он всегда ссылается на один и тот же объект, т. Е. Указатель является постоянным. Это не означает, что сам объект неизменен (или неизменен).

Неизменность объектов достигается по-другому - не давайте нам public методов, которые изменяют содержимое объекта. Например, String s и Date s всегда неизменяемы независимо от ключевого слова final.

Другой пример final: При использовании перед классом это означает, что класс не может быть подклассифицирован.

+0

К сожалению, 'java.util.Date' изменен, см.' SetTime (long) 'http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#setTime%28long%29 –

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