• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォームが閉じれないのはなぜでしょう?(JBuilder))

フォームが閉じれないのはなぜでしょう?(JBuilder)

このQ&Aのポイント
  • フレームAのボタンがクリックされた時に新しいフレームBを作成して表示したが、フレームBが終了されない。
  • フレームAを終了させると同時にフレームBも終了される。
  • フレームBを単体で終了させる方法はあるのか、またフレームBをフレームAの上に表示させる方法はあるのか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

JBuilderでしたらフレームBのjbinit()メソッドの中に this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); の一行を加えればいいと思います。 一応フレームBのプロパティのdefaultCloseOperationを DISPOSE_ON_CLOSEに設定すると以上のように自動で記述されます。

t-tree
質問者

お礼

お答えありがとうございました。 JBuilder 8を使用していますが、ロジックに "this.setDefaultCloseOperationWindowConstants.DISPOSE_ON_CLOSE); "と書くと下記のエラーが出ます。 "変数WindowConstantsが見つかりません" "メソッドsetDefaultCloseOperationが見つかりません" なぜでしょう?

その他の回答 (2)

回答No.3

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さんのやりたいような機能は果たすと思います。ただ私が未確認なのはご了承ください。 }

t-tree
質問者

お礼

何度も何度も本当にありがとうございます。 参考にさせていただきます。 本当にありがとうございました。m(_ _)m

回答No.2

No.1のものです。 No.1ではJBuilder4で作ったときのやつなんですが、7で試すと this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); となってました。 JFrameクラスでWindowConstantsを継承してるので省略可ですね。 下で書いたプロパティで設定するという方法を試してみていただけますか?

t-tree
質問者

お礼

再度のお答えありがとうございます。 お礼が送れてすみません。 私の説明不足していて恐縮ですが、私の使用しているフレームは"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); } }

関連するQ&A