Как подписаться на события GUI в других JFrames - PullRequest
2 голосов
/ 15 ноября 2011

Как лучше подписаться на события из другого JFrame?Например, у меня есть форма «настройки», и когда пользователь нажимает «ОК» на форме настроек, я хочу, чтобы основная форма знала об этом, чтобы она могла получить настройки.1004 * Вот мой идеальный интерфейс:

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();
}

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Один из подходов состоит в том, чтобы иметь только один JFrame.Все остальные «свободно плавающие контейнеры верхнего уровня» могут быть модальными диалогами.Доступ к основному графическому интерфейсу пользователя будет заблокирован до тех пор, пока текущий диалог не будет закрыт, а код в главном фрейме сможет проверить настройки диалога после его закрытия.

2 голосов
/ 15 ноября 2011

Кто-то публикует Событие, что-то изменилось, вот настройки. Подписчик, который зарегистрировался для этого конкретного события, получает уведомление об этом и может выполнять свою работу, здесь можно получить настройки. Это называется издатель / подписчик.

Для этого вы можете использовать Eventbus или реализовать что-то меньшее по своему усмотрению.

0 голосов
/ 30 ноября 2011

Для тех, кто заинтересован, вот что я закончил.Я не уверен, что это лучший способ, но он работает для моих целей.

// 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;
}
...