2012-04-10 40 views
0

我刚刚尝试学习和搞乱代码。我遇到了一些我不希望发生的事情。我在MainApp类中有一个JLabel,我创建了一个传递JLabel的ActionListener(HelloListener)。当按下按钮时,actionPerformed方法应该将JLabel更新为“再次Hello!”。它确实如此,但它为什么会让我困惑。Java - ActionListener类的变量一致性..为什么这个工作?

不过,我想我会返回新JLabel的?当我传递HelloListener JLabel时,是不是JLabel在HelloListener类的属性通过后?所以当它更新时它只会更新HelloListener中的一个,然后我将不得不返回它?

为什么当我更新了的JLabel的HelloListener它也是在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!"); 
    } 

} 
+0

看看我的[对类似问题的回答](http://stackoverflow.com/a/10077580/544963)以获取有关如何执行此操作的说明。如果您需要进一步的帮助,请询问。 :) – fireshadow52 2012-04-10 12:34:29

回答

3

当我通过HelloListener选择JLabel,这不就是JLabel中的HelloListener类的 属性后,它传递?所以当它更新它只会更新它在HelloListener中的一个,然后我会 不得不返回它?

这是在你的理解中细分。当你“传递的JLabel”,要传递一个参考JLabel的(你实际上是路过的价值,你应该只要你了解你目前的问题查找的参考,因为它是与Java很重要) 。底层对象实例在以前的任何地方仍然存在。所以在HelloListener实例JLabel jl仅仅是一个参考到在GUI显示相同的实际JLabel实例

这是对Java(和很多编程语言)是如何工作的根本。如果你

Dog d = new Dog();

,然后通过d的方法

walk(d);

walk看起来像

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

的方法dog,并d在呼叫范围,都指向相同的Dog实例。所以就像您设置lastWalkTime一样,底层实例也会被修改。如果正好在walk之后,您看了d,您会看到您在该方法中设置的lastWalkTime值。

+0

很好的解释! – Tim 2012-04-10 12:44:59

+1

谢谢。我希望你明白。查看“按值传递Java”,这可能是新手对Java最容易被误解和困惑的部分。 – hvgotcodes 2012-04-10 12:45:53

0

为什么你会期望返回新的JLabel? (然后是什么?删除旧的,添加新的,让你的窗口再次进行布局?)你传递给监听器的JLabel实例用作JLabel的引用,这就是它的优点 - 你正在修改你现有的实例。

1

当一个函数将一个对象作为参数时,它将被传递给该对象的引用。在你的代码中,MainAppHelloListener都有对同一个JLabel实例的引用。

当调用actionPerformed()时,侦听器将修改实例的属性。由于JFrame可以访问同一个实例,因此它会检测到更改并更新GUI。

相关问题