48

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

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

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

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

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

4

6 に答える 6

116

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

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

関数は次のDialog.showDialog()ようになります。

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

JDialog で可視性を true に設定することはモーダル操作であるため、[OK] ボタンを押すと、インスタンス変数 ( result) を選択したダイアログの結果 (またはnullキャンセルされた場合) に設定できます。OK/Cancel ボタン方式で処理した後、次の操作を行います。

setVisible(false);
dispose();

showDialog()制御を関数に戻します。

于 2010-11-03T16:42:35.753 に答える
26

custom メソッドgetValue()をcustom に追加して、反対のことを行う必要がありますJDialog

このようJFrameにして、それ自体で何かを呼び出して設定する代わりに、ダイアログの値を から尋ねることができますJFrame

ダイアログに関するOracleチュートリアルを見ると、ここに記載されています

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

(ソースを見つけCustomDialogて、カスタム ダイアログをどのように設計するかを確認できます)

于 2010-11-03T16:41:13.870 に答える
4

私の方法をクールな方法で説明できるかどうかわかりません... ユーザーからその情報を取得しようとしている JDialog から productPrice と amount が必要だとしましょう。JFrame からそれを呼び出す必要があります。

JDialog 内で、productPrice と ammount を public 非静的グローバル変数として宣言します。

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 を呼び出して情報を取得します。

于 2013-04-11T18:38:48.917 に答える
0

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

JDialog から値を返します。dispose()、setVisible(false) - 例

于 2013-08-20T08:49:15.727 に答える
0

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 を使用して Bean クラスを作成し、ベクトルを使用して値を取得し、これらの値を jframe で取得します。 より詳しい情報

于 2012-05-22T05:55:16.230 に答える