
初めまして
JDialogを継承してOutputDialogと言うクラスを作り、モーダルなダイアログを作りました。上の×ボタンで閉じるだけではなく、閉じやすいようにJButtonでも閉じられるようにしたいと思ったのですが、×ボタンと同じ処理をするには何の処理を呼び出したらよいのでしょうか。
dispose()やsetVisible(false)だと、モーダルなままで消えてしまいましたので、setModal(false)とsetVisible(false)を両方使ったのですが、これで問題ないでしょうか。どなたか教えて下さい。
No.3ベストアンサー
- 回答日時:
すみません。
こちらの環境で確認したところ WindowEvent.WINDOW_CLOSEDではダイアログが閉じずにWindowEvent.WINDOW_CLOSINGの場合だとダイアログが閉じました。WindowEvent.WINDOW_CLOSINGで閉じるかどうか確認していただけないでしょうか?以下、動作確認したソース
import java.awt.Toolkit;
import java.awt.event.WindowEvent;
public class OutputDialog extends javax.swing.JDialog {
public OutputDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jPanel1.add(jButton1);
jButton2.setText("jButton2");
jPanel1.add(jButton2);
getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);
pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new OutputDialog(new javax.swing.JFrame(), true).setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JPanel jPanel1;
}
この回答への補足
今試した所、教えていただいた方法でうまく行きました。使ったコードは下記です。(前と同じです。)どうも有り難う御座いました。
public void actionPerformed(ActionEvent e) {
String s=((JButton)e.getSource()).getText();
if(s.equals("Close")){
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
//setModal(false);
//dispose();
}
if(s.equals("CSVファイルを出力")){
setOutput();
}
}

No.2
- 回答日時:
modalなJDialog 側からhide()でダイアログを閉じると、JDialogを呼び出したowner側のJDialog.show()発行の次の行へ実行が移りますけど。
よって親元の操作が可能になり、FileDialogのように、親元からダイアログ内の設定データ参照も可能になります。
modalダイアログを閉じるってそういう動作をさせたいのじゃないのかな?
今晩は。返事が遅くなって申し訳ありません。
実はhide()をAPI仕様書で調べた所、推奨されていないと書いてあり、setVisible(false)を使うよう書いてあったので、使いませんでした。
以前JFrameで、閉じた時にSystem.exit(0)を呼ばないでアプリケーションを作った所、フレームを閉じた後再起動しようとしてエラーになったことが有りました。JDialogを使う時も、×で閉じないでJButtonで閉じる時は、うまくやらないと同じような問題が起こるのではないかと思った訳ですが、System.exit(0)で終わらせたくは無い訳です。
深夜なのですぐには出来ませんが、皆さんに教えていただいた方法等を後で試して、ご報告いたします。
No.1
- 回答日時:
JButtonボタンのイベントの部分で(WINDOW_CLOSING or WINDOW_CLOSED)イベントをOutputDialogのインスタンスに対して発生させればいいと思います。
JButtonの閉じるボタンをクリック->イベント内でWindowsEventを発火(postEvent)->WindowEventの処理
参考コード(WINDOW_CLOSEDイベントを発火させる方法)
↓の thisの部分はOutputDialogのインスタンスを指定してください。
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSED));
参考URL
AWT のイベントを自分で発生させるにはどうすればよいのですか?
参考URL:http://javafaq.jp/S065.html
この回答への補足
今晩は。下記コードで実験してみました。
public void actionPerformed(ActionEvent e) {
String s=((JButton)e.getSource()).getText();
if(s.equals("Close")){
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSED));
//setModal(false);
//dispose();
}
if(s.equals("CSVファイルを出力")){
setOutput();
}
}
これはOutputDialog内のメソッドですが、何も起こりませんでした。
テスト方法に間違いが有ったら申し訳ないのですが、API 仕様書を読んだ所、WindowsEventは、ウィンドウの状態が変わったことを示す低レベルのイベントと書いてあるので、ウインドウを閉じるため、と言うよりは、ウインドウを閉じる事によって発生するイベントではないでしょうか。
もちろん、これをリスナーで受けてsetModal(false),dispose()等の処理をしても良いのですが、私はむしろ必要な処理が他にあれば上記のメソッド内で処理したいと考えています。
恐縮ですが、私の考えに間違いが有ったら、ご指摘いただけたら幸いです。
今晩は。回答を頂いて、どうも有り難う御座います。
後で、教えていただいた方法を試したり、リンク先の内容を良く読んで、
色々やって見ます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JPanelの切り替えと再描画
-
JPanelの重ね方/OverlayLayout他
-
ボタンクリック後パネルを再描...
-
javaで文字数制限するには?
-
パソコンキーボードで時分秒を...
-
IF関数でEmpty値を設定する方法。
-
java プログラミングについて
-
0dの意味を教えてください
-
C言語の変数(LSB)の合わせ込...
-
ループ処理の際、最後だけ","を...
-
複数のテキストボックスに同じ...
-
doubleとintの違い
-
JAVAでSJISのコード変換
-
system.out.printが出力されない
-
C言語のポインターに関する警告
-
n番目に大きな値を探索する
-
BOOL値を逆にしたい
-
この警告はどうすれば?
-
1~100までの数字を表示し、か...
-
javaの演算子の部分ですが 4行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
java junit list同士の比較方法
-
javaで文字数制限するには?
-
JPanelの重ね方/OverlayLayout他
-
ArrayListの使い方について(初...
-
TextAreaでの文字の色
-
JPanelの切り替えと再描画
-
setPrefferedSizeとsetSize
-
JFrameとJPanelの最大化について
-
【Swing】JPanel クラス外から...
-
フレームを閉じれない
-
Buttonを押すと画像が表示され...
-
JDialogを閉じた時の処理
-
BMI測定を作ろうとしている...
-
Java-Swing TextAreaにスクロー...
-
ボールが勝手に動き困ってます。
-
Javaについて
-
エラーで式の開始が不正ですと...
-
KeyListenerの使い方について
-
Enterキーでボタンを押すにはど...
-
4択クイズでのランダム出題の...
おすすめ情報