Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

setVisible(false);
dispose();

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

Ответ 3

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

Ответ 4

Когда вы передаете любое значение 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 с набором и методом get, используя значения vector и получите эти значения в jframe. Дополнительная информация

Ответ 6

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

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

}