カスタム描画とJButtonを含むモーダルJDialogボックスを作成しました。 JButtonをクリックすると、JDialogボックスが閉じて値が返されます。
SetModalPieceという名前の親JFrameに関数を作成しました。この関数は値を受け取り、ローカルJFrame変数に設定します。
問題は、(JDialogボックスに親JFrameへの参照がある場合でも)この関数がJDialogボックスから見えないことです。
2つの質問:1)JDialogボックスから親JFrameに値を返すより良い方法はありますか?
2)JDialogに渡されたJFrameへの参照を使用して、JFrame関数setModalPieceにアクセスできないのはなぜですか?
カスタムgetValue()
をカスタムJDialog
に追加することにより、逆の操作を行う必要があります。
この方法では、JFrame
自体で何かを呼び出すことで設定する代わりに、JFrame
からダイアログの値を要求できます。
ダイアログについてのOracleチュートリアルを見ると here
カスタムダイアログを設計している場合、ユーザーが選択したものについてダイアログにクエリできるように、ダイアログのAPIを設計する必要があります。たとえば、CustomDialogには、ユーザーが入力したテキストを返すgetValidatedTextメソッドがあります。
(CustomDialog
のソースを見つけて、カスタムダイアログを設計すると仮定する方法を確認できます)
私は一般的に次のようにします:
_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()
関数に制御を戻すため。
クールな方法でメソッドを説明できるかどうかわかりません...ユーザーからその情報を取得する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を呼び出して情報を取得します。
コンストラクターにインターフェースを追加しますか?
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);
}
}
}
}
これが私が通常行う方法です。確信が持てなかったので、その投稿を作成しました。
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でこれらの値を取得します。 詳細