2009-09-30 7 views
2

이 JFrame에서 버튼을 클릭 할 때 printobserver의 업데이트 메소드가 호출되지 않는 이유는 누구나 설명 할 수 있습니까?Java observer and observable

import java.awt.BorderLayout; 
import java.awt.Frame; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.IOException; 
import java.net.InetAddress; 
import java.net.SocketException; 
import java.util.Observable; 
import java.util.Observer; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


/** 
* 
*/ 

/** 
* @author james 
* 
*/ 
public class Driver extends JFrame { 


    /** 
    * @param title 
    */ 
    public Driver() { 
     super("click me"); 

     setSize(400, 400); 
     //set up observer 

     final ButtonObservable gw = new ButtonObservable(); 
     Observer o1 = new PrintObserver(); 
     gw.addObserver(o1); 

     setLayout(new BorderLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setExtendedState(Frame.MAXIMIZED_BOTH); 
     JPanel panel = new JPanel(); 
     add(panel, BorderLayout.CENTER);   

     JButton connectBtn = new JButton("print me"); //$NON-NLS-1$ 
     connectBtn.addActionListener(new ActionListener() {   
      public void actionPerformed(ActionEvent e) { 
       gw.buttonPress(); 
      } 
     }); 

     panel.add(connectBtn); 


    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     JFrame mypane = new Driver(); 
     mypane.setVisible(true); 

    } 

} 

class PrintObserver implements Observer 
{ 
    public void update(Observable o, Object arg) 
    { 
     int x = ButtonObservable.getX(); 
     File jf = new File("/home/foo/bar"); 
     try { 
      jf.createNewFile(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("Blah var -= " + x); 
    } 
} 

class ButtonObservable extends Observable 
{ 
    private static int x = 0 ; 

    @Override 
    public int countObservers() 
    { 
     return this.countObservers(); 
    } 

    public void buttonPress() 
    { 
     x += 1; 
     this.notifyObservers(); 

    } 

    /** 
    * @return the x 
    */ 
    public static final int getX() { 
     return x; 
    } 
} 

답변

5

Observable.setChanged으로 전화해야합니다. notifyObservers에 대한 API 문서는 "hasChanged 메서드에 표시된대로이 개체가 변경된 경우"로 시작됩니다.

하지만 실제로는 java.util.ObservableObserver을 사용하지 말 것을 강력히 권합니다.

+2

@ 톰, 대안에 대해 자세히 설명해 주시겠습니까? –

+1

나는 또한 알고 싶다. -1 정교하지 않기 때문에. –

+0

그래, 탐? 나는 패턴의 Java 구현도 싫어한다. 젠장, 나는 단지 자바를 싫어한다. – hamstar

5

톰이 먼저 Observable.setChanged으로 전화해야한다고 말한 것처럼

자바에서 Observable 구현의 문제는, :(그 나쁜 필요는 없지만, 그들 이후 업데이트되지는 JDK 1.0에서 오는 것입니다. 그렇다 내가 어떤 표시되지 않는 것을에서

문제는 있지만 Observable은 관찰자에 약한 참조를 사용하지 않는다는 점을 감안하면 (WeakReference는 Java 1.2에서 나타남) 관찰자가 더 이상 필요하지 않을 때 누출을 생성하지 않으려면 항상 deleteObserver을 호출해야합니다.

또 다른 대안이지만 인터페이스가 더 복잡한 것은 유틸리티 클래스 PropertyChangeSupport입니다. 스윙 청취자는 PropertyChangeListener 인터페이스와 해당 유틸리티 클래스를 사용하므로 UI ​​코드에서이 인터페이스를 사용하는 경우 더 적절할 것입니다.