1

MVC に基づいて Swing ユーザー インターフェイスを構築しようとしていますが、このトピックについていくつか質問があります。私の質問をする最良の方法は、簡単な例の助けを借りることです.

1 つの JButton と 3 つの JTextField を持つ JDialog があるとします。そのボタンが押されたら、この JDialog を閉じて、3 つの JTextFields からのデータを必要とする別の JDialog を開きます。

これを行う簡単な方法は次のとおりです (コードのスニペットだけを使用します。あまり気にする必要はありません)。

myButton.addMouseListener(new MouseAdapter(){

    @Override
    public void mouseClicked(MouseEvent evt){
        firstFrame.setVisible(false);
        secondFrame.setData(jTextField1.getText(),jTextField2.getText(),jTextField3.getText());//just sending the data to the new window, would be this or something similar
        secondFrame.setVisible(true);
        }});

またはそのようなもの。

最初の質問: 匿名の内部クラスを使用せず、Listener に別のクラスを使用することにした場合、3 つの JTextFields から mouseListener クラスにデータを渡すにはどうすればよいですか? ビューの参照を Listener クラスに保持する以外に代替手段はありますか?

MVCパターンを考えると、続けます:

2 番目の質問: リスナー (MVC によるコントローラー) が、モデルを関与させずに別のウィンドウを呼び出すのは理にかなっていると思います。それが仕事だと思います。しかし、あるウィンドウから次のウィンドウに渡す必要があるデータ (3JTextFields からのデータ) は、モデルを通過するべきではありませんか? 最初のウィンドウでそのデータをモデルに保存し、2 番目のウィンドウで必要になったときにモデルから要求するようにします。

3 番目の質問: Observer/Observable パターンの使用を検討していました。この例では、最後のウィンドウを開くためにどのように使用されますか? つまり、コントローラーは2番目のウィンドウを開くクラスであるため、リスナーが監視される必要があり、2番目のウィンドウがオブザーバーでなければならないことを意味します。

 notifyObservers("openSecondWindow");

次に、2 番目のウィンドウがそれを確認して開きますか?

最後に: PropertyChangeListener も同様に機能し、Observer/Observable パターンよりも優先される場合があると聞きました。特に私の例に関して、これについてどう思いますか。

私は混乱しています..

お時間をいただきありがとうございます。

4

2 に答える 2

0

最初の質問

匿名の内部クラスを使用しないが、リスナーに別のクラスを使用することにした場合、3つのJTextFieldからmouseListenerクラスにデータを渡すにはどうすればよいですか?

MouseAdapterのクラスにはコンストラクターがあり、必要なものをJPanelクラスからクラスに渡しますMouseAdapter

このコードはのためのものですが、一般的な考え方でクラスActionListenerの書き方がわかると思います。MouseAdapter

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import com.ggl.project.planner.model.Planner;
import com.ggl.project.planner.model.Project;
import com.ggl.project.planner.view.CreateUpdateProjectDialog;
import com.ggl.project.planner.view.ProjectPlannerFrame;

public class CreateProjectActionListener implements ActionListener {

    protected Planner planner;

    protected Project project;

    protected ProjectPlannerFrame frame;

    public CreateProjectActionListener(ProjectPlannerFrame frame,
            Planner planner, Project project) {
        this.frame = frame;
        this.planner = planner;
        this.project = project;
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        CreateUpdateProjectDialog dialog = 
                new CreateUpdateProjectDialog(frame, project, true);
        if (dialog.isOkPressed()) {
            planner.setProjectOpen(true);
        }
    }

}

2番目の質問

リスナー(MVCによるコントローラー)がモデルを関与させずに別のウィンドウを呼び出すことは理にかなっていると思います。それは私が推測する仕事です。しかし、あるウィンドウから次のウィンドウに渡す必要のあるデータ(3JTextFieldsからのデータ)は、モデルを通過するべきではありませんか?最初のウィンドウでそのデータをモデルに保存し、2番目のウィンドウで必要になったときにモデルにデータを要求するのと同じです。

あなたの質問を理解できるかわかりません。GUIを構築するとき、GUIからの値を表す1つ以上のデータモデルがあります。これらのデータモデルのインスタンスは、GUIを構成するほとんどのコンポーネントを介して渡されます。

アプリケーションの残りの部分は、モデルを介してGUI情報にアクセスします。

ActionListener最初の質問への回答の一部として投稿したクラスには、2つのデータモデルがProjectありPlannerます。 Projectは特定のプロジェクトに固有ですPlannerが、GUIに対してグローバルです。

3番目の質問

Observer/Observableパターンの使用を検討していました。この例では、最後のウィンドウを開くためにそれをどのように使用しますか?

Swingにはすでにリスナーパターンが組み込まれています。独自のアクションにアクションリスナーを使用できます。面倒なプロセスですが、独自のリスナータイプをSwingに追加することもできます。JPanelを作成するためにを拡張したときに、自分のリスナータイプを一度追加しましたJCroppingPanel

于 2012-09-11T17:13:56.910 に答える
0

Java固有の側面についてはわかりません。しかし、OOP について言えば、イベント駆動型の設計によってアプリケーションを分離することはかなり合理的です。したがって、コンポーネントを直接処理する代わりに、次のようにイベントをトリガーしますnotifyObservers("openSecondWindow");

ただし、そのためにモデル層を通過する必要はありません。代わりにevent、特定のイベントを表すクラスを用意し、イベント クラス内の前述のフィールドの値を設定する必要があります。

何かのようなもの:

exampleEvent.setProperty1('blah').setProperty2('blah2');
notify('openSecondFrame', exampleEvent);

少し前に、このイベント駆動型のものに関する質問を投稿しました。

PHP: イベント駆動型プログラミングとシグナル認識インターフェース (Signal and Slots / Observer Pattern) を混同していませんか?

読んでみたいと思われるリンクがいくつかあります (これは PHP ですが、概念は OOP に適用されます)。

したがって、この概念に従って、EventHandlerこれらのイベントとシグナルを管理するコンポーネントを作成することをお勧めします。

しかし、繰り返しになりますが、私は Java に精通していないことを考慮してください。それはちょうどOOPについてです。

于 2012-09-08T16:45:50.930 に答える