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

ここで私の質問は、内部クラスが外部クラスの変数とオブジェクトを表示できる場合、外部クラスで作成しhandlesListListenerslistオブジェクトを内部クラスが表示できないのはなぜNewGUIStuffですか?

4

5 に答える 5

2

非静的内部クラスは、外部クラスのインスタンス変数と、それらが宣言さfinalれている場合 (匿名の内部クラスの場合) に囲まれているローカル変数 (クロージャーを考えてください) を見ることができます。これらの非静的内部クラスにはthis、コンパイラによって挿入された外部への暗黙的な参照があり、それが外部クラスのメンバー変数の見方です。匿名クラスを囲む最終的なローカル変数は、コンパイラーが生成するコンストラクターに暗黙的に渡され、内部クラス自体の最終メンバー フィールドに格納されます。

あなたの場合、まったく異なる字句コンテキストで定義されたローカル変数が表示されることを期待しているように見えます。これは、内部クラスが知らないものです。それを外部クラスのメンバー変数に変換すると、内部クラスに表示されます。

于 2012-04-17T19:02:02.530 に答える
2

リスト オブジェクトは、NewGUIStuff クラスのスコープではなく、go() メソッドのスコープ内にあるためです。リスト オブジェクトは、同じメソッド内でのみ「見る」ことができます。

于 2012-04-17T18:58:38.260 に答える
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 に答える
1

あなたのlist変数は method に対してローカル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

これlistは、関数内のローカル変数であるためgo()です。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であると宣言する必要があることに注意してください。

于 2012-04-17T18:58:49.770 に答える