初めまして
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で質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) PC利用中に勝手に起動する窓を消し去る方法を教えて下さい。 1 2023/05/08 16:48
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/10 14:24
- Windows 10 ファイルエクスプローラーでフォルダを閉じる操作について 2 2022/10/15 11:06
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- その他(ブラウザ) Excel VBA seleniumのedge操作について 業務上、分からないことがございまして、先 1 2022/06/20 16:59
- その他(悩み相談・人生相談) お客様は神さまとか言うけど閉店後に電気消えてる中ネットをくぐって入ってきて普通に使ってたけど割れたか 1 2022/09/13 00:24
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaで文字数制限するには?
-
連番をオブジェクト名の最後に...
-
JPanelの切り替えと再描画
-
次のように書いたのですが、ウ...
-
最後の行に移動するには?
-
KeyListenerの使い方について
-
エラーで式の開始が不正ですと...
-
ArrayListの使い方について(初...
-
Java-Swing TextAreaにスクロー...
-
eclipse java swing
-
EXECLの行を削除
-
JDialogを閉じた時の処理
-
java junit list同士の比較方法
-
コンパイルエラー <identifier...
-
TextAreaでの文字の色
-
JavaのswingでCardLayoutの画面...
-
Buttonを押すと画像が表示され...
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
JSPやサーブレットでSystem.out...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
java junit list同士の比較方法
-
javaで文字数制限するには?
-
JTableの列ヘッダ
-
TextAreaでの文字の色
-
最後の行に移動するには?
-
【Swing】JPanel クラス外から...
-
4択クイズでのランダム出題の...
-
コンパイルエラー <identifier...
-
JPanelの重ね方/OverlayLayout他
-
JPanelの切り替えと再描画
-
エラーで式の開始が不正ですと...
-
JTable の 列幅を個別に設定す...
-
VB6.0でのTextboxの高さ変更
-
連番をオブジェクト名の最後に...
-
ボタンクリック後パネルを再描...
-
JavaでのSwingを使った簡易電卓...
-
ArrayListの使い方について(初...
-
Buttonを押すと画像が表示され...
-
あるコンボボックスを選択する...
-
KeyListenerの使い方について
おすすめ情報