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

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

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

フレームAのボタンがクリックされた時に下記のように新しくフレームBを作成して表示したのですが、その新しいフレームBが画面右上の×ボタンをクリックしても終了されません。フレームAを終了させると同時にフレームBも終了されます。どうしてたら、フレームB単体で終了させれますか? あと、フレームBが表示されたときフレームAの後ろに表示されます。これをフレームAの上にフレームBを表示させることはできませんか? 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); }

  • t-tree
  • お礼率83% (183/218)
  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
回答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

  • ボタンクリックでパネル表示方法?(JBuilder)

    ボタンをクリックしたタイミングで、パネルを生成しそれを表示したいのですが表示されません。下記のロジックに問題または、足りないものがありますか? void btnA_mouseClicked(MouseEvent e) { Panel1 pnlSub = new Panel1(); pnlSub.setVisible(true); } ちなみにパネルはSwingのJPanelではなくAWTのPanelを生成しております。

    • ベストアンサー
    • Java
  • 簡易電卓が作れない…

    簡易電卓を作ろうとしているのですが、どうしても分からない所があります。 とりあえずテストの為、以下のようなプログラムを作りました。 「dentaku.java」 import java.awt.*; import java.awt.event.*; class dentaku{ public static void main(String[] agrs){ Frame frame=new Frame("電卓"); frame.setSize(500,800); frame.setLayout(null); Button button0=new Button("0"); button0.setLocation(10,710); button0.setSize(80,80); Button buttonC=new Button("C"); buttonC.setLocation(100,710); buttonC.setSize(80,80); Button button1=new Button("1"); button1.setLocation(10,620); button1.setSize(80,80); Button button2=new Button("2"); button2.setLocation(100,620); button2.setSize(80,80); Button button3=new Button("3"); button3.setLocation(190,620); button3.setSize(80,80); Button button4=new Button("4"); button4.setLocation(10,530); button4.setSize(80,80); Button button5=new Button("5"); button5.setLocation(100,530); button5.setSize(80,80); Button button6=new Button("6"); button6.setLocation(190,530); button6.setSize(80,80); Button button7=new Button("7"); button7.setLocation(10,440); button7.setSize(80,80); Button button8=new Button("8"); button8.setLocation(100,440); button8.setSize(80,80); Button button9=new Button("9"); button9.setLocation(190,440); button9.setSize(80,80); Button buttonP=new Button("+"); buttonP.setLocation(280,440); buttonP.setSize(80,80); Button buttonM=new Button("-"); buttonM.setLocation(280,530); buttonM.setSize(80,80); Button buttonK=new Button("×"); buttonK.setLocation(280,620); buttonK.setSize(80,80); Button buttonW=new Button("÷"); buttonW.setLocation(280,710); buttonW.setSize(80,80); TextField nyuuryoku = new TextField(""); nyuuryoku.setLocation(10,380); nyuuryoku.setSize(350,50); TextField kekka = new TextField("0"); kekka.setLocation(10,320); kekka.setSize(350,50); button1.addActionListener(new dentaku_num(nyuuryoku)); button2.addActionListener(new dentaku_num(nyuuryoku)); frame.add(button0); frame.add(buttonC); frame.add(button1); frame.add(button2); frame.add(button3); frame.add(button4); frame.add(button5); frame.add(button6); frame.add(button7); frame.add(button8); frame.add(button9); frame.add(buttonP); frame.add(buttonM); frame.add(buttonK); frame.add(buttonW); frame.add(nyuuryoku); frame.add(kekka); frame.setVisible(true); } } 「dentaku_num.java」 import java.awt.*; import java.awt.event.*; class dentaku_num implements ActionListener{ TextField txt; int num=0; Button button1; Button button2; dentaku_num(TextField txt){ this.txt = txt; } public void actionPerformed(ActionEvent e){ if(e.getSource()== button1) {num=1;} if(e.getSource()== button2) {num=2;} txt.setText(String.valueOf(num)); } } 予想では、「1」を押したら下のテクストボックスに1が、「2」を押したら2が表示されると思いました。 しかし結果は、両方とも「0」が表示されるだけです。 不思議に思い、「if(e.getSorce)~」の2文を消してみたら、これも同じ結果でした。 どうやら、eを受け取っていない(?)ようなのですが、どの様にしたらうまく行くでしょうか。 見づらい分だとは思いますが、宜しくお願いします。

    • ベストアンサー
    • Java
  • JAVAプログラムをWEB表示させるには・・・

    import java.awt.*; import javax.swing.*; class Test { public static void main(String args[]) { Frame frm = new Frame("テスト"); frm.setLayout(null); frm.setSize(new Dimension(450,550)); frm.setVisible(true); JFormattedTextField[] array = new JFormattedTextField[45]; for(int i = 0 ;i < array.length ; i++){ array[i] = new JFormattedTextField (); frm.add(array[i]); array[i].setSize(65, 22); array[i].setLocation(121+(i%3)*66, 130+(i/3)*22); } } } フレームにいくつかのテキストを入れただけの簡単なプログラムなのですが、これをJSPでWEB表示させたいのですが・・・・なかなかうまくいかなく困ってます。色々サイトを見ているのですが、解説だとわかりにくく、サンプルコードを載せてるところを探しているのですが、それも見つかりません。JAVAプログラムをJSPでWEB表示させるには、どのような方法があるのか教えていただけないでしょうか?よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのエラーなのですが

    import java.awt.*; import java.awt.event.*; class PrefFrame extends Frame { public PrefFrame(String title) { //フレームのタイトル setTitle(title); //ウィンドウを閉じる時 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } } public class PrefTest { public static void main(String args[]) { PrefFrame frm = new PrefFrame("都道府県マスター"); frm.setLocation(300, 200); frm.setSize(250, 350); frm.setBackground(Color.LIGHT_GRAY); frm.setVisible(true); } } と入力しました。コンパイルは出来て、CLASSファイルは作成できたのですが、実行できずにエラーException in thread "main" java.lang.NoClassDefFoundError: PrefTest/javaとなってしまいます。実行するためにはどうしたらよいのでしょうか?

  • 配列のシャッフル

    MCの中のフレーム1にイラストA、フレーム2にイラストB、フレーム3にイラストCを置いてそれぞれボタン化(btnA、btnB、btnC)し、 そのMCをコピーしてタイムライン上に3つ配置して、ランダムに被らないように表示して、btnAをクリックすると、シャッフルしてランダムに再び表示するというのを1フレーム内でやりたいのですがどうしたらいいでしょうか? 配列のシャッフルを使うというのは分かったのですが、その後が分からなくて・・・ 環境はFLASH8です

  • java applet 上段に2×3、下段に1×3のボタンを作る

    タイトルのようなアプレットを作りたいのですがなぜか実行されません。どこがおかしいのでしょうか? (文字数制限のため省略) { private JButton bt[] = new JButton[9]; private JPanel pn[] = new JPanel[2]; int i; public void init() { Container cnt = getContentPane(); for(i=0; i<9; i++){ add(bt[i] = new JButton("")); } pn[0] = new JPanel(); pn[1] = new JPanel(); //上パネルに置くボタン6つ bt[0].setSize(80,80); bt[0].setLocation(0,0); bt[1].setSize(80,80); bt[1].setLocation(80,0); bt[2].setSize(80,80); bt[2].setLocation(160,0); bt[3].setSize(80,80); bt[3].setLocation(0,80); bt[4].setSize(80,80); bt[4].setLocation(80,80); bt[5].setSize(80,80); bt[5].setLocation(160,80); //下パネルに置くボタン3つ bt[6].setSize(80,80); bt[6].setLocation(0,200); bt[7].setSize(80,80); bt[7].setLocation(80,200); bt[8].setSize(80,80); bt[8].setLocation(160,200); //上パネルと下パネルの作成 pn[0].setLocation(0,0); pn[1].setLocation(0,200); //ボタンをパネルに付ける pn[0].add(bt[0]); pn[0].add(bt[1]); pn[0].add(bt[2]); pn[0].add(bt[3]); pn[0].add(bt[4]); pn[0].add(bt[5]); pn[1].add(bt[6]); pn[1].add(bt[7]); pn[1].add(bt[8]); //コンテナへ追加 cnt.add(pn[0]); cnt.add(pn[1]); } } 座標を指定してボタンを設置する方法にしたいと思っています。 ちなみに完成図はこのような感じにしたいです。 ↓ □□□ □□□ □□□

    • ベストアンサー
    • Java
  • イベント発生時によるフレーム表示の方法

    こんにちは、JAVA初心者です。 フレームにメニューバーを付け、そのメニューの項目をマウスでクリックした時に、新しく別のフレームを表示させたいのですが、やり方が分かりません。リスナーによるイベント処理の中をどのようにしたら良いのか教えてください。 if( color.equals("~") ) { ~ ;} ~の部分に、フレームを表示させるプログラムを強引に入れてみたのですが、当然のことながらエラー。 どのようにすれば良いのでしょうか?? //フレームを表示させるプログラム import javax.swing.*; class aho extends JFrame { public aho( String name ) { //コンストラクタ setTitle(name); setDefaultCloseOperation(aho.EXIT_ON_CLOSE);} } public class SwingSample1 { public static void main(String[] args) { aho figure = new aho ("フレーム表示"); figure.setLocation( 0, 0); figure.setSize( 500, 500); figure.show();} } この質問を答える為に不足している情報があったら、教えてください。その場合、すぐにでも補足致します! 宜しくお願いします!!

  • JavaのSwingで別のフォームを閉じる方法

    こんにちは。 JavaのSwingにおいて,以下のようなプログラムがあるとします。 その場合,A.javaでボタンを押すと,B.javaのフォームが閉じるようにしたいのですがどのようにしたらいいのでしょうか?よろしくお願いします。 ****A.java**** import ☆省略☆; public class A extends JFrame implements ActionListener{ //ボタン JButton end; public A(){ //フレームの設定 setVisible(true); setTitle("テスト"); //コンテナの設定 con = getContentPane(); //ボタン end = new JButton(" 終了 "); end.addActionListener(this); end.setActionCommand("end"); con.add(end); pack(); } public void actionPerformed(ActionEvent e){ String m = e.getActionCommand(); if(m == "end"){ ※ここに書くべき処理 } } } ****B.java**** import ☆省略☆; public class B extends JFrame{ //コンテナ Container con; public Answer(){ //フレームの設定 setVisible(true); setTitle("B"); //コンテナに関わる設定 con = getContentPane(); } }

  • java swing での質問です。

    javaのプログラミングをeclipseでしているのですが swingで行き詰ってしまいました。 タブペインを使いタブパネルを作り、その中にボタンを配置したのですが、 ボタンの位置をsetBoundsで動かすことができませんでした。 他の命令を使わなければならないのでしょうか? プログラミング自体が初心者のため、説明に不備があると思いますが 助けていただけると幸いです。 ひどいプログラミングかと思いますが張らせていただきました package gui; import java.awt.*; import javax.swing.*; public class ReisyokuMenu extends JFrame{ /*serialVersionUID*/ private static final long serialVersionUID=1L; /*コンポーネント作成*/ JButton syokuzaiBtn = new JButton("食材一覧"); JButton syoumiBtn = new JButton("賞味期限順"); JButton bunruiBtn = new JButton("分類"); JButton returnBtn=new JButton("Topへ"); JPanel tabPanel1 = new JPanel(); JPanel tabPanel2 = new JPanel(); JTabbedPane tabbedpane = new JTabbedPane(); public ReisyokuMenu(){ /*Closeボタンでアプリケーションが終了しないように設定*/ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); /*フレームサイズを変更できないように設定*/ setResizable(false); /*フレームコンテナのインスタンスを生成*/ Container cPane = getContentPane(); /*レイアウトマネジャを利用しない(座標を指定する)*/ cPane.setLayout(null); setLocationRelativeTo(null); setSize(400, 380);//setBoundsはy、x、幅、高さを指定するのでsetLocationRelativeToで位置指定をする為に使用。 setTitle("一人暮らし支援ツール");//アプリケーションタイトルを入れる tabbedpane.addTab("食材を見る", tabPanel1); tabbedpane.addTab("食材を探す", tabPanel2); tabPanel1.add(syokuzaiBtn); tabPanel1.add(syoumiBtn); tabPanel1.add(bunruiBtn); syokuzaiBtn.setLocation(50, 80);//「選択」ボタン syoumiBtn.setBounds(10,10,325,120); bunruiBtn.setBounds(10,270,90,40); tabPanel2.add(new JLabel("食材名:")); tabPanel2.add(new JTextField("", 10)); setContentPane(tabbedpane); } public void setVisible(boolean isVisible){ if(isVisible){ /*フレームの表示位置を指定(x,y)*/ setLocation(200,200); } /*フレームを表示*/ super.setVisible(isVisible); } }

  • ウインドウ上で変数を表示する方法はありますか?

    ウインドウ上で変数を表示する方法はありますか? system.out.println()ではコマンドプロンプトだけで表示されるので それをウインドウを作成して表示させたいんです。 よろしくお願いします。 import java.awt.*; import java.awt.event.*; import java.applet.Applet; import java.awt.Graphics; class PrefFrame extends Frame { public PrefFrame(String title) { //フレームのタイトル setTitle(title); //ウィンドウを閉じる時 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } } public class xptable { public static void main(String[] args) { PrefFrame frm = new PrefFrame("ラテーブル"); frm.setLocation(300, 200); frm.setSize(600, 480); frm.setBackground(Color.black); frm.setVisible(true); double exp = 0; int Lv = 1; double xp = 1900; double cxp = 0; while(Lv < 200){ if (cxp>xp){ Lv = Lv+1; System.out.println("レベル"+ Lv +"になりました。おめでとうございます。"); xp = xp*1.1; } else { exp = Math.round((Math.random()*90000000)); System.out.println((int)Math.floor(exp) + " 経験値獲得しました。");/*切捨て*/ cxp = cxp+exp; } } } }