0

私はコードを学び、いじり回そうとしているところです。そして、私は私が起こるとは思っていなかった何かに出くわしました。MainAppクラスにJLabelがあり、JLabelが渡されるActionListener(HelloListener)を作成します。ボタンが押されると、actionPerformedメソッドはJLabelを「Helloagain!」に更新する必要があります。そしてそれはそうです、しかしなぜそれがそれをするのか私を混乱させます。

しかし、私は新しいJLabelを返却する必要があると思いましたか?HelloListenerにJLabelを渡すと、そのJLabelは渡された後のHelloListenerクラスのプロパティではありませんか?それで、それが更新するとき、それはHelloListenerの1つだけを更新します、そしてそれから私はそれを返さなければなりませんか?

HelloListenerでJLabelを更新すると、MainAppクラスでも更新されるのはなぜですか?

コードは次のとおりです。

public class MainApp extends JFrame {

    public static void main(String[] args) {

        new MainApp();

    }

    public MainApp() {

        setLayout(new GridLayout (2,1));

        setSize(200,200);

        JLabel jl = new JLabel("Hello!");
        add(jl);

        JButton jb = new JButton("Click me!");
        jb.addActionListener(new HelloListener(jl));
        add(jb);

        setVisible(true);

    }

}

public class HelloListener implements ActionListener {

    JLabel jl;

    public HelloListener(JLabel jl) {
        this.jl = jl;
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        jl.setText("Hello again!");
    }

}
4

3 に答える 3

3

HelloListener に JLabel を渡すと、その JLabel は渡された後の HelloListener クラスのプロパティではないでしょうか。それで、それが更新されると、HelloListenerのものだけが更新され、それを返さなければならないでしょうか?

これがあなたの理解の崩壊があるところです。「JLabel を渡す」とは、JLabel への参照を渡すことです (実際には参照を値で渡します。Java では非常に重要であるため、現在の問題を理解したらすぐに調べる必要があります)。基になるオブジェクト インスタンスは、以前存在していたすべての場所にまだ存在しています。したがって、JLabel jlインスタンス内の は、GUI に表示されるのと同じ実際の JLabel インスタンスへのHelloListener単なる参照です。

これは、Java (および多くのプログラミング言語) がどのように機能するかの基本です。もしあなたがそうするなら

Dog d = new Dog();

dメソッドに渡す

walk(d);

そして次のようにwalk見えます

public void walk(Dog dog) {
   dog.setLastWalkTime(now());
   dog.attachLeash(); 
}

dogメソッド内とd呼び出しスコープ内では、どちらも同じ Dog インスタンスを指しています。そのため、lastWalkTime を設定すると、基礎となるインスタンスが変更されます。walkを見た直後であれば、メソッドに設定しdlastWalkTime値が表示されます。

于 2012-04-10T12:29:47.477 に答える
1

関数がオブジェクトを引数として受け取る場合、オブジェクトへの参照が渡されます。コードでは、 と の両方が同じインスタンスへの参照MainAppを持っています。HelloListenerJLabel

actionPerformed()呼び出されると、リスナーはインスタンスのプロパティを変更します。はその同じインスタンスにアクセスできるためJFrame、変更を検出して GUI を更新します。

于 2012-04-10T12:31:21.937 に答える
0

新しい JLabel を返すことを期待するのはなぜですか? (それから何? 古いものを削除し、新しいものを追加し、ウィンドウでレイアウトをやり直しますか?) リスナーに渡す JLabel インスタンスは、JLabel への参照として使用されます。それがその美しさです。既存のインスタンスを変更しています。

于 2012-04-10T12:30:31.577 に答える