System.exit(0);について

このQ&Aのポイント
  • mainフレームから呼び出した子フレームをexit(0)で消すとどちらのフレームも消えてしまいます。
  • mainフレームを消さない方法を探しているのですが見つかりません。
  • ただし、this.etDefaultCloseOperation(JFrame.DISEPOSE_ON_CLOSE);で×を押して消すのではなく、終了ボタンを付けて、actionPerformed内で終了したいです。 また、setVisible(false);のように、メモリが残った状態にもしたくありません。 (メモリが残らないように子フレームを消したいです。)
回答を見る
  • ベストアンサー

System.exit(0);について

System.exit(0);について mainフレームから呼び出した子フレームをexit(0)で消すとどちらのフレームも消えてしまいます。 mainフレームを消さない方法を探しているのですが見つかりません。 ただし、this.etDefaultCloseOperation(JFrame.DISEPOSE_ON_CLOSE);で×を押して消すのではなく、終了ボタンを付けて、actionPerformed内で終了したいです。 また、setVisible(false);のように、メモリが残った状態にもしたくありません。 (メモリが残らないように子フレームを消したいです。) ご存知の方おられましたら教えてください。よろしくお願いいたします。

  • Java
  • 回答数2
  • ありがとう数8

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

  • ベストアンサー
  • foggi47
  • ベストアンサー率87% (7/8)
回答No.1

普通にJFrame#disposeメソッドではいけませんか? Windowクラスから継承されているものですが、ウィンドウを破棄するというものです。 DISPOSE_ON_CLOSEは終了ボタンが押されたときにdisposeを呼び出しているだけなので、終了ボタンでdisposeしたければ、自分でそのようなコードを書けばいいのです。

hatokamome
質問者

お礼

すみません補足欄にお礼を書いてしまいました。

hatokamome
質問者

補足

disposeで子フレームのメモリを消すことができました。 Javaの内部で何が起こっているのか勉強します。 ありがとうございました。

その他の回答 (1)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

System.exitをするとVM自体を終了してしまうからね。 メモリに残したくない場合は 子ウィンドウの変数を親ウィンドウに依存させないことが重要ね。 変数のスコープはしっかり管理しないといけないわ。 もちろん子ウィンドウのスコープもね。 どうしても心配なら最後に子ウィンドウ=null;としてあげればGC対象になるわ。

hatokamome
質問者

お礼

ありがとうございます。 依存度を下げるための知識を習得する必要があるのですね。 変数のスコープを改善しようと思います。 貴重なヒントありがとうございました。

関連するQ&A

  • system.exit(0)について

    GUIを使ってフレームにパネルのっけて、ボタンを押すとそのフレームが開くようにしました。 で消すときにsystem.exit(0)を実行するとそのプログラム自体が終了してしまうじゃないですか?そうではなくて、そのフレームだけが閉じるようにするメソッドはないのですか?単に、setVisible(false)にするしか方法はないのですか?教えて

  • swingのJframeについて

    JFrameについて質問があるのですが import javax.swing.*; public class JFrameTest extends JFrame{ public static void main(String[] args){ JFrameTest frame = new JFrameTest(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } JFrameTest(){ JPanel p = new JPanel();   Container contentPane = getContentPane(); ContentPane.add(p);   pack(); } } このプログラムと import javax.swing.*; public class JFrameTest{ public static void main(String[] args){ JFrame frame = new JFrame("フレームのタイトル"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds( 10, 10, 300, 200); frame.setVisible(true); JPanel p = new JPanel();   Container contentPane = frame.getContentPane(); frame.ContentPane.add(p);   frame.pack(); } } このプログラムは何が違うのでしょう? やってることはまったく一緒だと思ってたのですが、全然違うみたいです。 上のプログラムの JFrameTest(){ はコンストラクタと呼ばれるものなのでしょうか? しょぼい質問で申し訳ないのですが誰か教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • javaのswingについて

    swingを使う場合、絶対mainの中で udp u=new udp(); JFrame frame = new JFrame("チャットプログラム"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ウィンドウを閉じたときにアプリケーションを終了する frame.setJMenuBar(u.menuBar); frame.getContentPane().add(u.sp, "North"); frame.getContentPane().add(u.buttonPanel, "Center"); frame.getContentPane().add(u.tfPanel, "South"); frame.pack(); // ウィンドウを適切な大きさにする frame.setVisible(true); // ウィンドウを可視化する などをしないといけないのでしょうか? mainのクラスからgamenといったクラスをnewするかたちにする方法はありますか? 何か良い方法はないでしょうか?

  • addとremoveActionListener

    以下のプログラムは作っているプログラムの簡易版で、他のクラスからaddActionListenerを追加しようとしているですが、やり方が分かりません。 どうプログラミングすればいいか教えてください。 あと、removeActionListenerを使いたいのですが、これについて書かれているサイトが少なく、使い方がよくわからないので、こちらも教えて欲しいです。 import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; public class Test1 extends JFrame { public Test1(){ super("test1"); Set set=new Set(this); setBounds(100,100,806,659); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); add(set); JMenuBar menubar = new JMenuBar(); JMenu menu1=new JMenu("メニュー"); menubar.add(menu1); JMenuItem menuitem1=new JMenuItem("終了"); menu1.add(menuitem1); setJMenuBar(menubar); } public static void main(String[] args){ new Test1().setVisible(true); } } class Set extends JPanel{ Set(final JFrame frame){ /*ここにaddを入れたかった frame.menuitem1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } });*/ //removeActionListener 使用方法不明 } }

    • ベストアンサー
    • Java
  • Jframeの中にJframeを表示させたい

    Jframeの中にボタンを作り、ボタンを押すとJInternalFrameではなくJframeを表示させるようにしたいんですが、なかなかできません。 検索したりしてサンプル探したんですが、 Jframeを表示させ、ラベルを貼ったりしたいんですが どなたかお願いします!! public class Browser extends JFrame{ public static void main(String args[]) { Browser frame = new Browser(); frame.setTitle(""); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setVisible(true); } //ボタン private JButton bt = new JButton("~~"); public Browser() { bt.addActionListener(this); JToolBar tb = new JToolBar(); tb.setFloatable(false); getContentPane().add(tb, BorderLayout.NORTH); JPanel panel2 = new JPanel(); panel2.add(bt); panel2.setLayout(new FlowLayout(FlowLayout.LEFT)); tb.add(panel2); } //↓この辺りの処理の記述で頭が混乱してきました(泣 public class actionPerformed(ActionEvent e){ if(e.getSource() == bt){ Frame FW = new Frame(); FW.setSize(500,400); FW.setVisible(true); } } class Frame extends Frame{ public Frame(){ //コンストラクタの定義 } }

    • ベストアンサー
    • Java
  • モーダレスダイアログについて

    はじめまして。 モーダレスダイアログについて質問がございます。フレーム(JFrame 継承)から、このフレームを所有者とするモーダレスダイアログ(JDialog 継承)を表示した状態で、マウスクリックによりフレームをアクティブにした場合、フレームは背面に表示されたままとなりますが、このフレームをダイアログの前面に表示させることは可能でしょうか?ご存知の方がいらっしゃいましたらご教授願います。尚、下記にサンプルソースを記載します。 ■環境  OS:WinXP  java:j2sdk1.4.2_08 ※ダイアログ生成時に所有者を指定しなければ、フレームをダイアログ前面に表示させることが可能ですが、この方法だと再度モーダレスダイアログをアクティブにした場合、上記とは別インスタンスのフレームから表示されたモーダレスダイアログも連動して前面に表示されるという事象を確認しております。 public class ParentFrame extends JFrame implements ActionListener { public static void main(String[] args) { ParentFrame frame = new ParentFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public ParentFrame() { super("親フレーム"); setSize(300, 200); setLocationRelativeTo(null); JButton btn = new JButton("ダイアログ表示"); btn.addActionListener(this); getContentPane().add(btn); } public void actionPerformed(ActionEvent e) { // モーダレスダイアログ生成 JDialog dlg = new JDialog(this, "子ダイアログ"); dlg.setSize(200, 100); dlg.setLocationRelativeTo(this); dlg.setVisible(true); } }

  • 次のように書いたのですが、ウィンドウの背景色が白になりませんでした。setBackground辺りがおかしいと思うんですが。

    本に書いてあった下記のプログラムを書いて実行したのですが、ウィンドウズの背景色が白になりませんでした。 setBackground(WHITE)をBLACKにしても、背景色は変わりません。 どこに問題があるのか教えていただけないでしょうか。 import javax.swing.JFrame; import java.awt.Color; import java.awt.Insets; public class GameTestMain { JFrame frame1; GameTestMain(){ frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } Eclipse3.0.1を使っています。 よろしくお願いしますm(_ _)m

  • フレームを消したい

    こんにちは。 いつもお世話になっております。 また、どうしてもわからないことが出てきてしまいました。 質問よろしいでしょうか? 以下のプログラムを実行して 「次へ」と書かれたボタンをクリックし 次に現れるフレーム上の「このフレームだけ消す」 と書かれたボタンをクリックしたときに 「f2」(2つ目のフレーム)だけ閉じるようにしたいのです。 以下の場合は両方とも閉じてしまうのです。 何かよい方法ご存知ありませんか? よろしくお願いいたします。 ================================================== import java.awt.*; import javax.swing.*; import java.awt.event.*; class unload { public static void main(String[] args) { JFrame f=new JFrame("kiki"); Origin p=new Origin(); Container ct=f.getContentPane(); ct.add(p); f.pack(); f.setVisible(true); } } class Origin extends JPanel implements ActionListener { JButton b; Origin() { b=new JButton("次へ"); this.add(b); b.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource()==b) { JFrame f2=new JFrame(); Origin2 p2=new Origin2(); Container ct=f2.getContentPane(); ct.add(p2); f2.pack(); f2.setVisible(true); } } } class Origin2 extends JPanel implements ActionListener { JButton b2; Origin2() { b2=new JButton("このフレームだけ消す"); this.add(b2); b2.addActionListener(this); } public void actionPerformed(ActionEvent e) { if(e.getSource()==b2) { System.exit(0); } } }

    • ベストアンサー
    • Java
  • 「削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください」とコンパイルエラーになってしまいます!

    下記のソースコードをコンパイルすると 「HelloWorldSwing.java:6: JFrame にアクセスできません。 クラスファイル .\JFrame.java は不正です。 ファイルにクラス JFrame が含まれていません。 削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。 JFrame frame = new JFrame("HelloWorldSwing");」 と表示されてしまいエラーになってしまいます。 どなたか、分かる方がいましたらアドバイスください!! <HelloWorldSwing.java>--------------------------- import javax.swing.*; public class HelloWorldSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } -------------------------------------------------

    • ベストアンサー
    • Java
  • SwingでgetContentPaneのエラーです、お願いします

     今晩は、java勉強中のものです、宜しくお願いします。  下のようなプログラムを組んでみましたが、「型JFrameから非staticメソッドgetContentPane()にstatic参照 することは出来ません」というエラーコードです。  原因が良く分かりません、どなたか教えて下さい。  いくら考えても原因がよく分かりません、宜しくお願いします。 ================================================================ public class Panel_train extends JFrame{ public static void main(String[] args) { Container cnt = getContentPane(); JPanel jpanel = new JPanel(); JTextArea jtext = new JTextArea("Hello World", 100, 50); jpanel.add(jtext); cnt.add(jpanel, BorderLayout.CENTER); JFrame frame = new JFrame("テスト"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setVisible(true); } }

    • ベストアンサー
    • Java

専門家に質問してみよう