Как я могу вернуть значение из окна JDialog в родительский JFrame?

Я создал модальное окно JDialog с пользовательским рисунком и кнопкой JButton. Когда я нажимаю кнопку JButton, окно JDialog должно закрыться и должно быть возвращено значение.

Я создал функцию в родительском JFrame с именем setModalPiece, которая получает значение и устанавливает его в локальную переменную JFrame.

Проблема в том, что эта функция не видна из окна JDialog (даже если в окне JDialog есть ссылка на родительский JFrame).

Два вопроса: 1) Есть ли лучший способ вернуть значение из окна JDialog в его родительский JFrame?

2) Почему нельзя использовать ссылку на JFrame, переданную в JDialog, для доступа к моей функции JFrame setModalPiece?


person Rolan    schedule 03.11.2010    source источник


Ответы (6)


Вы должны сделать обратное, добавив пользовательский метод getValue() в свой пользовательский JDialog.

Таким образом, вы можете запросить значение диалога у JFrame вместо того, чтобы устанавливать его, вызывая что-то на самом JFrame.

Если вы посмотрите учебник Oracle о диалогах здесь, он гласит

Если вы разрабатываете собственное диалоговое окно, вам необходимо разработать API вашего диалогового окна, чтобы вы могли запрашивать диалоговое окно о том, что выбрал пользователь. Например, в CustomDialog есть метод getValidatedText, который возвращает введенный пользователем текст.

(вы можете найти источник CustomDialog, чтобы увидеть, как они предполагают, что вы создадите свой собственный диалог)

person Jack    schedule 03.11.2010

Я обычно делаю так:

Dialog dlg = new Dialog(this, ...);
Value result = dlg.showDialog();

Функция Dialog.showDialog() выглядит так:

ReturnValue showDialog() {
    setVisible(true);
    return result;
}

Поскольку установка видимости в значение true в JDialog является модальной операцией, кнопка OK может установить переменную экземпляра (result) в выбранный результат диалога (или null, если отмена). После обработки в методе кнопки OK/Cancel делаем так:

setVisible(false);
dispose();

чтобы вернуть управление функции showDialog().

person Jonathan    schedule 03.11.2010
comment
Спасибо за это! Я искал последний час, как это сделать, и это сработало именно так, как я хотел. - person BMB; 17.02.2012
comment
Небольшой комментарий - если вы используете JDialog, вы должны объявить его модальным, через правильный параметр в конструкторе или через SetModal(true); - person Oz Radiano; 16.04.2014
comment
К вашему сведению, обновление полезного комментария @Oz Radiano: setModal Этот метод устарел и сохранен только для обратной совместимости. Вместо этого используйте setModalityType(). - person Tamias; 17.06.2018
comment
например, this.setModalityType(DEFAULT_MODALITY_TYPE); - person Tamias; 17.06.2018

Я не знаю, смогу ли я объяснить свой метод классным способом... Допустим, мне нужны productPrice и сумма из JDialog, который получит эту информацию от пользователя, мне нужно вызвать это из JFrame.

объявить productPrice и ammount как общедоступные нестатические глобальные переменные внутри JDialog.

public float productPrice;
public int amount;

* это входит в глобальную область видимости класса диалогового окна.

добавьте эти строки в конструктор JDialog, чтобы обеспечить модальность

super((java.awt.Frame) null, true);
setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);

* это происходит внутри конструктора класса диалогового окна

скажем, имя класса вашего JDialog - «MyJDialog», когда вы вызываете что-то вроде этого

MyJDialog question = new MyJDialog();
MyJDialog.setVisible(true); 
// Application thread will stop here until MyJDialog calls dispose();
// this is an effect of modality
//
// When question calls for dispose(), it will leave the screen,
// but its global values will still be accessible.
float myTotalCostVar = question.productPrice * question.ammount;
// this is acceptable.
// You can also create public getter function inside the JDialog class,
// its safer and its a good practice.

* это относится к любой функции в вашем JFrame и вызовет JDialog для получения информации.

person Felype    schedule 11.04.2013

Когда вы передаете любое значение JFrame в JDialog, создайте параметризованный конструктор jdialog и в jframe всякий раз, когда вы хотите вызывать. например Параметризованный конструктор, например:

 public EditProduct(java.awt.Frame parent, boolean modal, int no) {
      //int no is number of product want to edit.
      //Now we can use this pid in JDialog and perform whatever you want.
}

Если вы хотите передать значения из JDialog в JFrame, создайте класс bean-компонента с методом set и get для значений, используя вектор, и получите эти значения в jframe. Подробнее

person Rajshri    schedule 22.05.2012

Вот как я обычно это делаю. Я не был уверен, поэтому я создал этот пост:

Возвращаемое значение из JDialog; dispose(), setVisible(false) — пример

person guitar_freak    schedule 20.08.2013

Добавить интерфейс в конструктор?

public class UploadConfimation extends JDialog {

private final JPanel contentPanel = new JPanel();


public interface GetDialogResponse{
    void GetResponse(boolean response);
}



/**
 * Create the dialog.
 */
public UploadConfimation(String title, String message, GetDialogResponse result) {
    setBounds(100, 100, 450, 300);
    setTitle(title);
    getContentPane().setLayout(new BorderLayout());
    contentPanel.setLayout(new FlowLayout());
    contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
    getContentPane().add(contentPanel, BorderLayout.CENTER);
    {
        JLabel lblMessage = new JLabel(message);
        contentPanel.add(lblMessage);
    }
    {
        JPanel buttonPane = new JPanel();
        buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER));
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
        {
            JButton okButton = new JButton("YES");
            okButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    result.GetResponse(true);
                    dispose();
                }
            });
            buttonPane.add(okButton);
            getRootPane().setDefaultButton(okButton);
        }
        {
            JButton cancelButton = new JButton("NO");
            cancelButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    result.GetResponse(false);
                    dispose();
                }
            });
            buttonPane.add(cancelButton);
        }
    }
}

}

person Wil_Ryan    schedule 13.04.2016