2

私は、ディスプレイの内容にアクセスする必要JFrameがある「ディスプレイ」とボタンを含むJPanelJTextFieldコントロール」を含む を持っています。私の問題は、原則として私が理解しているオブザーバーパターンの使用方法に関連していると思います。リスナーを配置してメッセージを更新する必要がありますが、これらを配置する場所、あるパネルから別のパネルにアクセスする方法、および必要に応じて「データモデル」クラスを導入する方法についての手がかりがありません。たとえば、コントロール パネルから のコンテンツにアクセスしたいのですが、次のように匿名アクション リスナーを使用します。JPanelJPanelJTextField

JButton openfile = new JButton("Convert file");
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        openButtonPressed();
    }           
});
4

4 に答える 4

1

1つのレイヤーでモデルを作成し、その上に1つまたは2つのレイヤーを追加してコンポーネントとレイアウトを作成すると、コードがよりクリーンになります。確かにJFrameとのようなものを拡張しないでくださいJPanel

モデルレイヤーの構成階層を表示と完全に一致させる必要性を感じないでください。次に、からテキストを取得しDocument、関連する操作を実行するだけです。

さて、perhpasはそれほど単純ではありません。スイングモデルは少し厄介です。特に、ButtonModelは脳に損傷を与えており、コードのコントローラー領域は完全に純粋ではない可能性があります。

于 2008-11-26T11:30:53.153 に答える
1

これらのオブジェクト間の結合を減らす必要があります。

すべてのテキストフィールドとボタンを所有するマスターオブジェクトを持つことができます(パネルは無関係です)

次に、そのマスターオブジェクト内の個別のアクションリスナー(私はそれをメディエーターと呼びます。メディエーターパターンを参照してください)

そのアクションリスナーはメディエーターでメソッドを実行し、メディエーターはテキストフィールドから値を取得して、おそらく転送オブジェクトを作成します。

このようにして、パネルやテキストフィールドなどの間の結合を減らし、コントロールを1つの場所(メディエーター)に配置します。つまり、お互いに通知しません。

あなたはこの質問のコードを見ることができます: https ://stackoverflow.com/questions/324554/#324559

コードを実行する際のこれらの概念を示しています。

ところで、オブザーバーパターンはすでにJTextField、JButton、ActionListenerなどに実装されています。フックを追加するだけです。

これがお役に立てば幸いです。

編集2つの答えを1つに結合しました。

これがコードです。

class App { // this is the mediator

    // GUI components.
    private JFrame frame;
    private JTextField name;
    private JTextField count;
    private JTextField date;
    // Result is displayed here.
    private JTextArea textArea;

    // Fired by this button.
    private JButton   go;

    private ActionListener actionListener;


    public App(){
        actionListener = new ActionListener(){
            public void actionPerformed( ActionEvent e ){
                okButtonPressed();
            }
        };
    }

    private void okButtonPressed(){
         // template is an object irrelevant to this code.
         template.setData( getData() );
         textArea.setText( template.getTransformedData() );
    }


    public void initialize(){

        frame     = new JFrame("Code challenge v0.1");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        name     = new JTextField();
        count    = new JTextField();
        date     = new JTextField();
        textArea = new JTextArea();
        go       = new JButton("Go");
        go.addActionListener( actionListener ); // prepare the button.

        layoutComponents(); // a lot of panels are created here. Irrelevant.
    }
}

完全で実行中のコードは、次の場所で取得できます

可能であれば、継承よりも構成を優先することが重要です。

于 2008-11-28T08:26:54.973 に答える
0

いわゆるビルダーがあり、子パネルから親パネルを構築します。このビルダーでは、リッスンする必要があるすべてのサブコンポーネントにアクセスできるため、そこに任意のロジックを実装できます。

最後に、ビルダーは完全なロジックを含む親パネルを返します。

親パネルを取得すると、子コンポーネントにアクセスして何かを実行させるのは本当に面倒です。

于 2008-11-26T12:13:22.787 に答える
0

ありがとう。パネル間の通信を処理するデータモデル層を追加しました。

また、JTextField のリスナーに関するこのリンクも役に立ちました。

リンクテキスト

于 2008-11-26T14:49:20.617 に答える