制作JFrame和Observable对象

Mav*_*rik 7 java swing observable observer-pattern

我有一个类,比方说MyJFrame我代表我的应用程序的GUI.它实现了接口Observer并覆盖了该方法update.

public class MyJFrame extends JFrame implements Observer{
  ...
  public void update(Observable arg0, Object arg1){
     ...
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想让我的JFram成为一个Observable对象,但我不能,因为它已经扩展了类JFrame.我试图在我的类中创建一个Observable类型的变量.

public class MyJFrame extends JFrame implements Observer{
  Observable observable = new Observable();
Run Code Online (Sandbox Code Playgroud)

这里的问题是我可以将Observer添加到这个可观察字段,我也可以通知观察者但是我不能调用该方法setChanghed()(因为它被声明为protected),必须在通知之前调用它.

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

谢谢!!

Hov*_*els 7

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

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

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

例如:首选组合而不是继承?

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


Jef*_*rey 3

延长Observable并公布setChanged()

  • 当您扩展一个类时,您可以使用比以前更高的可见性修饰符重新声明其方法。由于“Observable”的“setChanged()”受到保护,因此您可以创建“Observable”的子类,并将“setChanged()”设置为公共。 (2认同)