我有一个类让我们说MyJFrame
代表我的应用程序的GUI。它实现了接口Observer
并覆盖方法update
。
public class MyJFrame extends JFrame implements Observer{
...
public void update(Observable arg0, Object arg1){
...
}
}
现在我想让我的JFram成为一个Observable对象,但我不能,因为它已经扩展了类JFrame
。我尝试在我的类中创建一个Observable类型的变量。
public class MyJFrame extends JFrame implements Observer{
Observable observable = new Observable();
这里的问题是我可以将Observer添加到这个可观察字段中,我也可以通知观察者但是我不能调用方法setChanghed()
(因为它被声明为受保护),必须在通知之前调用
你对我能实现它有什么想法吗?
谢谢!
答案 0 :(得分:7)
我认为很多,我自己包括使用Observer Design Pattern而不使用Java的正式Observer/Observable
接口/类,并且有很多方法可以实现这一点,尤其是在Swing中。可能最灵活的是将PropertyChangeSupport
与PropertyChangeListeners
一起使用,这就是SwingWorkers实现此目的的方式。另一种是使用非常基本的ChangeListener接口。
如果您需要更具体的帮助,请提供有关您的问题的更多详细信息,我们可能会提供建议。
编辑1
这也解决了程序描述所暗示的一个单独但重要的问题:扩展JFrame的GUI类。许多人(包括我自己)建议你应该避免这样做,除非你的代码改变了JFrame的内在行为 - 那就是你的类重写了一个或多个JFrame的方法。在更广泛的讨论中,这是一个小小的讨论,讨论哪个更好:通过继承或通过组合来增强课程。
例如:Prefer composition over inheritance?
编辑2
下一个未经请求的建议:我尝试将我的GUI代码设置为创建JPanel而不是JFrame。这样,如果我想将GUI显示为独立的GUI,我只需动态创建一个JFrame,将我的gui的JPanel放入JFrame的contentPane,打包JFrame并显示它。如果我想将gui放入JDialog,JApplet,JOptionPane,或者使用容器,另一个JPanel,...的CardLayout中,我会执行相同的过程。这为我如何使用我的gui提供了极大的灵活性。
答案 1 :(得分:3)
扩展Observable
并声明setChanged()
公开。
答案 2 :(得分:2)
这样就可以了。
public class MyJFrame extends JFrame implements Observer {
private static class MyObservable extends Observable {
@Override
public void setChanged() {
super.setChanged();
}
}
private final MyObservable observable = new MyObservable();
// rest of your code
}