Java 制作一个框架和可观察的物体

Java 制作一个框架和可观察的物体,java,swing,observer-pattern,observable,Java,Swing,Observer Pattern,Observable,我有一个类,比如说MyJFrame,它代表我的应用程序的GUI。它实现接口Observer,并覆盖方法update public class MyJFrame extends JFrame implements Observer{ ... public void update(Observable arg0, Object arg1){ ... } } 现在我想让我的JFram也成为一个可观察的对象,但我不能,因为它已经扩展了类JFrame。我试图创建一个在我的类中可以观

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

public class MyJFrame extends JFrame implements Observer{
  ...
  public void update(Observable arg0, Object arg1){
     ...
  }
}
现在我想让我的JFram也成为一个可观察的对象,但我不能,因为它已经扩展了类
JFrame
。我试图创建一个在我的类中可以观察到的变量类型

public class MyJFrame extends JFrame implements Observer{
  Observable observable = new Observable();
这里的问题是,我可以将Observer添加到这个observable字段,也可以通知observable字段,但是我不能调用方法
setchanged()
(因为它被声明为受保护的),必须在通知之前调用该方法

你知道我可以实施它吗


谢谢

扩展
Observable
并声明
setChanged()
公共。

我认为这里的很多人,包括我自己,都在使用而不使用Java的正式
Observable/Observable
接口/类,实现这一点的方法很多,特别是在Swing中。可能最灵活的方法是将
PropertyChangeSupport
propertychangelisters
一起使用,这就是Swingworker实现此功能的方式。另一个是使用非常基本的ChangeListener接口

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

编辑1
这还涉及到一个单独但重要的问题,这是程序描述中提出的:扩展JFrame的GUI类。这里的许多人(同样包括我自己)建议您应该避免这样做,除非您的代码改变了JFrame的内在行为——即您的类重写了一个或多个JFrame的方法。这是关于哪个更好的讨论中的一个小的子讨论:通过继承或通过组合来增强类

例如:

编辑2
下一个未经请求的建议:我尝试将我的GUI代码用于创建JPanel,而不是JFrames。这样,如果我想将我的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
} 

你能再详细一点吗?谢谢扩展类时,可以使用比以前更高的可见性修饰符重新声明其方法。由于
Observable
s
setChanged()
受到保护,您可以创建
Observable
的子类,其中
setChanged()
是公共的。我现在不知道该方法,但我确信不可能修改方法的可见性。谢谢,它很管用!你可能还想看看气垫船的答案。人们倾向于使用
属性ChangeListener
s,而不是
Observable
/
Observator
。因此可以增加可见性,但不能降低,对吗?变量也是一样的吗?谢谢你说如果我想制作一个GUI,最好将JFrame声明为类的变量并使用它?PropertyChangeListeners+SwingWorkers,而不是Observable+1@lucaghera:我不能100%准确地说什么对你的情况更好,但是我自己,如果可以避免的话,我宁愿不扩展JFrame,而且我通常都能成功地做到这一点。这很有趣,因为Eclipse插件WindowBuilder和我做的一样。但我认为这两个版本都有效;)@lucaghera:没什么好笑的,这也是我不喜欢使用gui构建工具的另一个原因对于OP可能是正确的,但我认为对于这种实现,GUI的输出必须包装到invokeAndWait()中,