web-dev-qa-db-ja.com

JDialogボックスから親JFrameに値を返すにはどうすればよいですか?

カスタム描画とJButtonを含むモーダルJDialogボックスを作成しました。 JButtonをクリックすると、JDialogボックスが閉じて値が返されます。

SetModalPieceという名前の親JFrameに関数を作成しました。この関数は値を受け取り、ローカルJFrame変数に設定します。

問題は、(JDialogボックスに親JFrameへの参照がある場合でも)この関数がJDialogボックスから見えないことです。

2つの質問:1)JDialogボックスから親JFrameに値を返すより良い方法はありますか?

2)JDialogに渡されたJFrameへの参照を使用して、JFrame関数setModalPieceにアクセスできないのはなぜですか?

42
Rolan

カスタムgetValue()をカスタムJDialogに追加することにより、逆の操作を行う必要があります。

この方法では、JFrame自体で何かを呼び出すことで設定する代わりに、JFrameからダイアログの値を要求できます。

ダイアログについてのOracleチュートリアルを見ると here

カスタムダイアログを設計している場合、ユーザーが選択したものについてダイアログにクエリできるように、ダイアログのAPIを設計する必要があります。たとえば、CustomDialogには、ユーザーが入力したテキストを返すgetValidatedTextメソッドがあります。

CustomDialogのソースを見つけて、カスタムダイアログを設計すると仮定する方法を確認できます)

23
Jack

私は一般的に次のようにします:

_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()関数に制御を戻すため。

108
Jonathan

クールな方法でメソッドを説明できるかどうかわかりません...ユーザーからその情報を取得するJDialogのproductPriceと金額が必要だとしましょう。JFrameから呼び出す必要があります。

productDialogと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
Felype

コンストラクターにインターフェースを追加しますか?

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
Wil_Ryan

これが私が通常行う方法です。確信が持てなかったので、その投稿を作成しました。

JDialogから値を返す; dispose()、setVisible(false)-例

0
guitar_freak

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に値を渡す場合、setおよびgetメソッドを使用してBeanクラスを作成し、vectorを使用して値を取得し、jframeでこれらの値を取得します。 詳細

0
Rajshri