2012-04-10 2 views
0

저는 방금 코드를 배우고 혼란스럽게 노력했습니다. 그리고 나는 일어날 것을 기대하지 않은 것을 보았습니다. MainApp 클래스에 JLabel이 있고 JLabel을 전달하는 ActionListener (HelloListener)를 만듭니다. 버튼을 누르면 actionPerformed 메소드는 JLabel을 "Hello again!"로 업데이트해야합니다. 그리고 그것은 그렇습니다. 그러나 그것이 왜 혼란 스럽습니까.Java - ActionListener 클래스 변수 일관성 .. 왜 작동합니까?

그러나 새 JLabel을 반환해야한다고 생각했습니다. HelloListener JLabel을 전달할 때 JLabel이 전달 된 후에 HelloListener 클래스의 속성이 아닌가요? 업데이트 할 때 HelloListener의 업데이트 만 수행하면 반환해야합니다.

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

} 
+0

이렇게하는 방법에 대한 내 [비슷한 질문에 대한 답변] (http://stackoverflow.com/a/10077580/544963)을보십시오. 추가 도움이 필요하면 그냥 물어보십시오. :) – fireshadow52

답변

3

내가 HelloListener JLabel의 통과, JLabel의는이 HelloListener 클래스의 특성 전달되지 후 것을? 그래서 업데이 트하면 HelloListener에서 업데이 트됩니다, 그리고 난 반환해야합니까?

여기가 이해할 수있는 고장입니다. "JLabel을 전달할 때"참조를 JLabel에 전달하고 있습니다 (현재 참조를 값으로 전달하고 있습니다. Java에서 매우 중요하기 때문에 현재 문제를 이해하는 즉시 참조해야합니다) . 기본 객체 인스턴스는 이전에 있었던 모든 곳에서 여전히 존재합니다. 따라서 HelloListener 인스턴스의 JLabel jl은 gui에 표시된 동일한 실제 JLabel 인스턴스에 대한 참조 일뿐입니다.

이것은 Java (및 많은 프로그래밍 언어)가 작동하는 방법의 기본입니다. 당신이 다음

Dog d = new Dog();

등을 할 경우

walk(d);

walk가 호출 범위

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

방법에 dogd처럼 보이는 방법에 d 전달 , 은 모두 동일한 Dog 인스턴스을 가리 킵니다. 따라서 lastWalkTime을 설정할 때 sson처럼 기본 인스턴스가 수정됩니다. walk 직후에 d을 본 경우 해당 방법에서 설정 한 lastWalkTime 값이 표시됩니다.

+0

위대한 설명! 덕분에 – Tim

+1

. 난 당신이 이해 바랍니다. '가치에 의한 자바 패스'를 보아라. 이것은 아마도 신규 이민자들을위한 자바의 가장 오해와 혼란스러운 부분 일 것이다. – hvgotcodes

0

왜 새 JLabel을 반환하겠습니까? (그리고 이전 버전을 제거하고, 새로운 것을 추가하고, 레이아웃을 다시 할 수있는 창이 있습니까?) 리스너에 전달하는 JLabel 인스턴스는 JLabel에 대한 참조로 사용됩니다. 기존 인스턴스를 수정하고 있습니다.

1

함수가 인수로 객체를 가져 오면 객체에 대한 참조가 전달됩니다. 코드에서 MainAppHelloListener은 동일한 JLabel 인스턴스에 대한 참조를 가지고 있습니다.

actionPerformed()이 호출되면 리스너는 인스턴스의 속성을 수정합니다. JFrame은 동일한 인스턴스에 액세스 할 수 있기 때문에 변경 사항을 감지하고 GUI를 업데이트합니다.