7

MyJFrameアプリケーションの GUI を表すクラスがあります。インターフェイスを実装し、Observerメソッドをオーバーライドしますupdate

public class MyJFrame extends JFrame implements Observer{
  ...
  public void update(Observable arg0, Object arg1){
     ...
  }
}

JFram も Observable オブジェクトにしたいのですが、既に class を拡張しているためできませんJFrame。クラスで Observable 型の変数を作成しようとしました。

public class MyJFrame extends JFrame implements Observer{
  Observable observable = new Observable();

ここでの問題は、Observer をこの監視可能なフィールドに追加でき、オブザーバーに通知することもできますがsetChanghed()、通知の前に呼び出す必要があるメソッドを呼び出すことができない (保護されていると宣言されているため) ことです。

私がそれを実装できるという考えはありますか?

ありがとう!!

4

3 に答える 3

7

ここでは、 Java の正式なインターフェース/クラスを使用せずにObserver Design PatternObserver/Observableを使用している人が多く、特に Swing ではこれを実装する方法がたくさんあると思います。おそらく最も柔軟なのは、SwingWorkers がこれをどのように実装するかを使用PropertyChangeSupportすることです。PropertyChangeListenersもう 1 つは、非常に基本的な ChangeListener インターフェイスを使用することです。

より具体的なサポートが必要な場合は、問題の詳細をお知らせください。提案を提供できる可能性があります。

編集1
これは、プログラムの説明で示唆されている別の重要な問題、つまりJFrameを拡張するGUIクラスにも当てはまります。ここにいる多くの人 (私も含めて) は、コードが JFrame の固有の動作を変更しない限り、これを避けるように勧めています。つまり、クラスが JFrame のメソッドの 1 つ以上をオーバーライドします。これは、継承によるクラスの拡張と合成によるクラスの拡張のどちらが優れているかについての、より大きな議論の小さなサブディスカッションです。

例:継承よりも構成を優先しますか?

編集 2
次の要求されていない推奨事項: GUI コードを、JFrame ではなく JPanel の作成に向けて調整しようとしています。このように、GUI をスタンドアロン GUI として表示したい場合は、その場で JFrame を作成し、GUI の JPanel を JFrame の contentPane に配置し、JFrame をパックして表示します。GUI を JDialog、JApplet、JOptionPane、またはコンテナー、別の JPanel を使用して CardLayout に配置する場合も、同じ手順を実行します。これにより、GUI の使用方法が非常に柔軟になります。

于 2011-08-06T17:45:20.020 に答える
3

public を拡張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 に答える