有Arraylists的JLists?

时间:2012-02-13 19:15:38

标签: java arrays swing listener jlist

我正在开发一个需要GUI的项目,但我没有使用GUI的经验,所以我所做的一切都是猜测。 我有一个已经放入JList的对象的arraylist,现在我试图根据用户选择的内容更改标签中的文本。我收到一个错误,上面写着“不能引用在不同方法中定义的内部类中的非最终变量库”

我正在使用的arraylist中填充了可以从

调用字符串的对象

如何让它发挥作用?

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

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

2 个答案:

答案 0 :(得分: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());
    }
});

快速解决方法是将typeLabel声明为final。 这意味着您无法将另一个值重新分配给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());
    }
});

编辑: 此外,列表必须声明为final。

答案 1 :(得分:0)

JList list的引用必须为final

final JList list = new JList(...)

Java中的final关键字有几个含义。当与变量或字段一起使用时,这意味着它总是引用相同的对象,即指针是常量。这并不意味着对象本身是不可更改的(或不可变的)。

对象的不变性以不同的方式实现 - 不要给我们任何改变对象内容的public方法。例如StringDate总是不可变的 无论final关键字如何。

final的另一个例子:当在类前面使用时,它意味着一个类不能被子类化。