制作JFrame和Observable对象

我有一个类让我们说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() (因为它被声明为protected),必须在通知之前调用它。

你对我能实现它有什么想法吗?

谢谢!!

扩展Observable并声明setChanged() public。

我认为很多,我自己包括使用Observer设计模式而不使用Java的正式Observer/Observable接口/类,并且有很多方法可以实现它,尤其是在Swing中。 可能最灵活的是将PropertyChangeSupportPropertyChangeListeners一起使用,这就是SwingWorkers实现它的方式。 另一种方法是使用非常基本的ChangeListener接口。

如果您需要更具体的帮助,请提供有关您的问题的更多详细信息,我们可能会提供建议。

编辑1
这也解决了程序描述所暗示的一个单独但重要的问题:扩展JFrame的GUI类。 许多人(包括我自己)建议你应该避免这样做,除非你的代码改变了JFrame的内在行为 – 那就是你的类重写了一个或多个JFrame的方法。 这是一个较小的子讨论,在更广泛的讨论中哪个更好:通过inheritance或通过组合来增强类。

例如: 首选组合而不是inheritance?

编辑2
下一个未经请求的建议:我尝试将GUI代码设置为创建JPanel而不是JFrame。 这样,如果我想将我的GUI显示为一个独立的GUI,我只需动态创建一个JFrame,将我的gui的JPanel放入JFrame的contentPane,打包JFrame并显示它。 如果我想将gui放入JDialog,JApplet,JOptionPane或者使用容器,另一个JPanel,…的CardLayout中,我会执行相同的过程。 这给了我如何使用我的gui的巨大灵活性。

这样做。

 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 }