2

別の JFrame からイベントをサブスクライブするためのベスト プラクティスは何ですか? たとえば、「設定」フォームがあり、ユーザーが設定フォームで [OK] を押したときに、メイン フォームにこれを知らせて、設定を取得できるようにします。

ありがとう。

これが私の理想的なインターフェースです:

public void showSettingsButton_Click() {
   frmSettings sForm = new sForm(this._currentSettings);
   //sForm.btnOkay.Click = okayButtonClicked;   // What to do here?
   sForm.setVisible(true);
}

public void okayButtonClicked(frmSettings sForm) {
    this._currentSettings = sForm.getSettings();
}
4

3 に答える 3

2

誰かがイベントを発行し、何かが変更されました。ここで設定が変更されました。この特定のイベントに登録したサブスクライバーは、それについて通知を受け、自分の仕事を行うことができます。ここで設定を取得します。これはパブリッシャー/サブスクライバーと呼ばれます。

これには、Eventbusを使用するか、独自に小さなものを実装できます。

于 2011-11-15T14:35:49.883 に答える
2

1 つのアプローチは、単一のJFrame. 他のすべての「フリー フローティング トップ レベル コンテナー」は、モーダル ダイアログにすることができます。メイン GUI へのアクセスは、現在のダイアログが閉じられるまでブロックされます。メイン フレームのコードは、ダイアログが閉じられた後にダイアログの設定を確認できます。

于 2011-11-15T15:02:04.247 に答える
0

興味のある人のために、これが私が最終的に行ったものです。それが最善の方法かどうかはわかりませんが、私の目的には合っています。

// Method called when the "Show Settings" button is pressed from the main JFrame
private void showSettingsButton_Click() {

   // Create new settings form and populate with my settings
   frmSettings sForm = new frmSettings(this.mySettings);

   // Get the "Save" button and register for its click event...
   JButton btnSave = sForm.getSaveButton();
   btnSave.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent evt) {
                SaveSettings(sForm);
            }
   });

   // Show the settings form
   sForm.setVisible(true);
}

// Method called whenever the save button is clicked on the settings form
private void SaveSettings(frmSettings sForm) {
   // Get the new settings and assign them to the local member
   Settings newSettings = sForm.getSettings();
   this.mySettings = newSettings;
}

そして、私のように .NET の観点から来ているのであれば、ここに C# バージョンがあります。

private void showSettingsButton_Click(object sender, EventArgs e)
{
   frmSettings sForm = new frmSettings(this.mySettings);
   sForm.btnSave += new EventHandler(SaveSettings);
   sForm.Show();
}

private void SaveSettings(object sender, EventArgs e)
{
   frmSettings sForm = (frmSettings)sender;  // This isn't the exact cast you need..
   Settings newSettings = sForm.Settings;
   this.mySettings = newSettings;
}
于 2011-11-30T16:56:29.593 に答える