Как я могу вернуть значение из поля JDialog в родительский JFrame? - PullRequest
42 голосов
/ 03 ноября 2010

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

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

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

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

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

Ответы [ 6 ]

106 голосов
/ 03 ноября 2010

Обычно я делаю это так:

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

Функция Dialog.showDialog() выглядит следующим образом:

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

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

setVisible(false);
dispose();

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

23 голосов
/ 03 ноября 2010

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

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

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

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

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

4 голосов
/ 11 апреля 2013

Я не знаю, смогу ли я объяснить свой метод классным способом ... Допустим, мне нужен 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 для получения информации.

0 голосов
/ 13 апреля 2016

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

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

}

0 голосов
/ 20 августа 2013

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

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

0 голосов
/ 22 мая 2012

Когда вы передаете какое-либо значение 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 и получите метод для значений, использующих вектор, и получите эти значения в jframe. Подробнее

...