2

从另一个 JFrame 订阅事件的最佳实践是什么?例如,我有一个“设置”表单,当用户在设置表单上按下确定时,我希望主表单知道这一点,以便它可以检索设置。

谢谢。

这是我理想的界面:

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

一种方法是只有一个JFrame. 所有其他“自由浮动顶级容器”都可以是模式对话框。访问主 GUI 将被阻止,直到当前对话框被关闭,主框架中的代码可以在对话框关闭后检查对话框的设置。

于 2011-11-15T15:02:04.247 回答
2

有人发布了一个事件,有些事情发生了变化,这里是设置。注册此 specifig 事件的订阅者会收到有关它的通知并可以完成他的工作,这里获取设置。这称为发布者/订阅者。

为此,您可以使用Eventbus或自行实现更小的东西。

于 2011-11-15T14:35:49.883 回答
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 回答