2012-02-13 47 views
1

我正在開發一個需要GUI的項目,但我沒有使用GUI的經驗,所以我一直在做的一切都是在某種意義上的猜測。 我已經創建了一個對象的數組列表,我已經把它放入JList中,現在我試圖根據用戶選擇的內容更改標籤中的文本。我得到那個說「不能指非final的變量庫在不同的方法定義的內部類中」與Arraylists JLists?

我使用的填充了,我可以從

調用字符串對象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 2012-02-13 19:18:42

+0

您的列表內容仍然可以更改,即使它被聲明爲「最終」 - 您不能將其他值指定給「列表」變量 – alex 2012-02-13 19:31:57

+0

感謝親戚 我明白了!現在只需複製我的代碼幾次,這是一個半完成的項目! – Ligerx 2012-02-13 19:52:47

回答

1

您不能在新的ListSelectionListener(){...}中訪問typeLabel變量。

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()); 
    } 
}); 

速戰速決將申報類型標爲決賽。 這意味着你不能重新分配另一個值來鍵入標籤,但這可能很好。

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(...) 

Java中的final關鍵字有幾個含義。當與變量或字段一起使用時,這意味着它始終引用相同的對象,即指針是常量。這並不意味着對象本身是不可更改的(或不可變的)。

以不同方式實現對象的不可變性 - 不要給我們任何改變對象內容的方法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 – 2012-02-13 21:25:19