Java Observer and Observable

Can someone explain why the update method on printobserver is not called when I click a button on this JFrame?

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

      

+2


source to share


2 answers


You need to call Observable.setChanged

. Note that the API docs for notifyObservers

begin with "If this object has changed as indicated by the hasChanged method."



But in fact, I highly recommend not using java.util.Observable

and Observer

.

+5


source


As Tom said, you first need to call Observable.setChanged

.

The problem with the implementation Observable

in Java is that it comes from JDK 1.0, which isn't necessarily a bad thing, but it hasn't been updated since then :(.



Also, I don't see any problem with it, but please note that it Observable

doesn't use weak references for observers (WeakReference appeared in Java 1.2), so you need to take care of always calling deleteObserver

so as not to create leaks when the observer no longer needs ...

Another alternative, but with a more complex interface, is the utility class PropertyChangeSupport

. Swing listeners are based on the interface PropertyChangeListener

and this utility class, so if you use it in your UI code, you will find it more appropriate.

+5


source







All Articles