7

我有一个类,让我们说它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();

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

您对我可以实施它有任何想法吗?

谢谢!!

4

3 回答 3

7

我认为这里有很多人,包括我自己在内,都使用了观察者设计模式,而不使用 Java 的正式Observer/Observable接口/类,并且有很多方法可以实现这一点,尤其是在 Swing 中。可能最灵活的是使用PropertyChangeSupport哪个PropertyChangeListenersSwingWorkers 实现这一点。另一种是使用非常基本的 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 方面具有极大的灵活性。

于 2011-08-06T17:45:20.020 回答
3

扩展Observable并宣布setChanged()公开。

于 2011-08-06T17:40:00.613 回答
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
} 
于 2011-08-06T17:58:42.503 回答