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;
}
}
source to share
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.
source to share