1
import javax.swing.*;
import javax.swing.event.*;

public class NewGUIStuff{
    public static void main(String args[]){
        NewGUIStuff gui = new NewGUIStuff();
        gui.go();
    }

    class handlesListListeners implements  ListSelectionListener{
        public void valueChanged(ListSelectionEvent lse){
            list.setVisibleRowCount(4);
        }
    }
    public void valueChanged(ListSelectionEvent lse){

    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JList list;

        String[] aList = {"alpha","beta","gamma","delta","epsilon","zeta","eta","theta"};
        list = new JList(aList);
        list.addListSelectionListener(new handlesListListeners());
        JScrollPane scroller = new JScrollPane(list);
        scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        frame.setContentPane(scroller);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}

所以我的问题是如果内部类可以看到它们的外部类变量和对象,为什么内部类不能handlesListListeners看到list我在NewGUIStuff外部类中创建的对象?

4

5 回答 5

2

答案是,“你的内部类可以看到外部类”,这不是你的问题。

您的问题是NewGUIStuff该类没有任何成员字段供内部类查看。list您声明的变量是该go方法的本地变量。

public class NewGUIStuff {
    JList list; //this is a member field

    ...

    public void go() {
        ...
        JList list; //this is a local variable
        ...
    }
}
于 2012-04-17T18:58:28.083 回答
2

因为列表对象在 go() 方法的范围内,而不是 NewGUIStuff 类的范围内。列表对象只能在同一方法内“看到”。

于 2012-04-17T18:58:38.260 回答
2

如果声明了(在匿名内部类的情况下),非静态内部类可以看到外部类实例变量和它们被包围的那些局部变量(想想闭包)。final那些非静态内部类this对编译器插入的外部有一个隐式引用,这就是它们如何看待外部类的成员变量。包含匿名类的最终局部变量将隐式传递到编译器将为您生成的构造函数中,并存储在内部类本身的最终成员字段中。

在您的情况下,我看到您希望看到在完全不同的词汇上下文中定义的局部变量,您的内部类对此一无所知。将其转换为外部类成员变量,您的内部类将看到它。

于 2012-04-17T19:02:02.530 回答
1

您的list变量是方法的本地变量go()。如果您希望它可见,则需要将其设置为NewGUIStuff. 像这样的东西:

public class NewGUIStuff {

    private JList list = new JList(); // Member of outer class so in scope from handlesListListeners

    public static void main(String args[]) {
        NewGUIStuff gui = new NewGUIStuff();
        gui.go();
    }

    class handlesListListeners implements  ListSelectionListener {

        public void valueChanged(ListSelectionEvent lse) {
            list.setVisibleRowCount(4);
        }
    }
}
于 2012-04-17T18:58:44.513 回答
1

这是因为listgo()函数中的局部变量。它超出了handlesListListeners课程的范围。

如果list是外部类的实例变量,那么内部类将能够看到它。或者,您也可以将内部类设为go()函数的本地类,这意味着它list现在在范围内:

void go() {
    final JList list = ...
    list.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent event) {
            // list is now in scope
            list.setVisibleRowCount(4);
        }
    });
}

注意如果以这种方式使用,list必须声明为final 。

于 2012-04-17T18:58:49.770 回答