- ベストアンサー
フォームが閉じれないのはなぜでしょう?(JBuilder)
- フレームAのボタンがクリックされた時に新しいフレームBを作成して表示したが、フレームBが終了されない。
- フレームAを終了させると同時にフレームBも終了される。
- フレームBを単体で終了させる方法はあるのか、またフレームBをフレームAの上に表示させる方法はあるのか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
JBuilderでしたらフレームBのjbinit()メソッドの中に this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); の一行を加えればいいと思います。 一応フレームBのプロパティのdefaultCloseOperationを DISPOSE_ON_CLOSEに設定すると以上のように自動で記述されます。
その他の回答 (2)
- okure_donchan
- ベストアンサー率54% (25/46)
NO.1のものです。 ////////////////////////////////////////////////// protected void processWindowEvent(WindowEvent e){ super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(1); } } ////////////////////////////////////////////////// このソースですが、System.exit(int);を使うと システム全部が終了してしまいます。 ですのでAでもBでも関係なく全インスタンスが消滅しますのでNo.2の補足のような事象が起きてしまいます。 変更方法ですがこんな例がありますね。 フレームBの上記のメソッドをこのように変更 ////////////////////////////////////////////////// protected void processWindowEvent(WindowEvent e){ super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { this.setVisible(false);//System.exit(1); } } ////////////////////////////////////////////////// かつフレームAの下記のメソッドをこのように変更 ////////////////////////////////////////////////// void btnA_mouseClicked(MouseEvent e) { Frame frm = new Frame(); frm.setVisible(true); frm.setSize(new Dimension(240, 320)); frm.setLocation(0,0); frm.setTitle("Title"); frm.setResizable(false); } ////////////////////////////////////////////////// 変更後 public class FrameA{ private FrameB frm = null; //FrameBインスタンスをクラス変数にする。 ・ ・ ・ ・ void btnA_mouseClicked(MouseEvent e) { if(frm == null){ frm = new FrameB(); }//Singletonパターン(インスタンスの複数生成を防ぐ) frm.setVisible(true); frm.setSize(new Dimension(240, 320)); frm.setLocation(0,0); frm.setTitle("Title"); frm.setResizable(false); } こうすることによってt-treeさんのやりたいような機能は果たすと思います。ただ私が未確認なのはご了承ください。 }
お礼
何度も何度も本当にありがとうございます。 参考にさせていただきます。 本当にありがとうございました。m(_ _)m
- okure_donchan
- ベストアンサー率54% (25/46)
No.1のものです。 No.1ではJBuilder4で作ったときのやつなんですが、7で試すと this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); となってました。 JFrameクラスでWindowConstantsを継承してるので省略可ですね。 下で書いたプロパティで設定するという方法を試してみていただけますか?
お礼
再度のお答えありがとうございます。 お礼が送れてすみません。 私の説明不足していて恐縮ですが、私の使用しているフレームは"javax.swing.JFrame"ではなく"java.awt.Frame "です。多分エラーがでたのはこの違いからだと思われます。 そこでフレームBの作成クラスにフレームAに書かれていた下記のロジックを追加しました所、フレームBを終了はできるのですが、同時にフレームAまで終了してしまいます。 なぜでしょう? //ウィンドウが閉じられたときに終了するようにオーバーライド protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(1); } }
お礼
お答えありがとうございました。 JBuilder 8を使用していますが、ロジックに "this.setDefaultCloseOperationWindowConstants.DISPOSE_ON_CLOSE); "と書くと下記のエラーが出ます。 "変数WindowConstantsが見つかりません" "メソッドsetDefaultCloseOperationが見つかりません" なぜでしょう?