2016-08-27 3 views
0

私は次のような問題があります。javaのスイングウィンドウをプログラムで表示して閉じることができます。しかし、他のウィンドウがまだ開いている限り、フレームが閉じているときは、アプリケーションを終了したくありません。javaが処分されてもアプリを終了できないのはなぜですか?

私が理解する限り、これはdispose()メソッドの意図です。すべてのウィンドウが削除され、スレッドがもう実行されないと、アプリケーションは終了します。

しかし、私のアプリがまったく終了しないという問題があります。さらに調査したところ、私はMWEを書いて同じ動作をしました。かなり前に、私が似たようなことをしたとき、それが期待どおりに機能していたことをほぼ100%確信しています。

私は自分のウィンドウマネージャを書く必要がありますか?これは、Javaはそのような機能を既に持っている必要がありますように、これは愚かだ。限り、私はドキュメントを理解する限り、それは動作するはずです...私は自分で任意のスレッドを開始していないと私はフレームが "X"またはボタンをクリックすると処分する必要がありますと思う。

問題を指摘できますか?

package optimworkers.gui.config; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Test extends JFrame 
{ 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new Test(); 
      } 
     }); 
    } 

    public Test() 
    { 
     JButton but = new JButton("Test"); 
     add(but); 
     but.addActionListener(new ActionListener() 
     { 

      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       setVisible(false); 
       dispose(); 
      } 
     }); 

     pack(); 
     setVisible(true); 

     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    } 

} 

編集:私は(正しいとUbuntuの14.04 LTS)Ubuntu Linuxの使用を

。私はOpenJDK 1.7.0_101と1.8.0_91(どちらもubuntuリポジトリから)を試しました。

JVMが移植性のあるコードを書くことができるので、私はこの特別なプロジェクトにjavaを使用するつもりです。したがって、JREの本当のバグでない場合は、アプリを終了してSystem.exit(0);コールを発行する必要があります。しかし、これを悪い習慣と読みます。今までこれを避けようとしていました。

+0

を使用することで、あなたは、setDefaultCloseOperation(EXIT_ON_CLOSE) ' – guleryuz

+1

は'私の知る限り、これは処分()method'の意図であることを理解として '試してみました - それは同様に私の理解で、 Window7でJDK 7を使用してもうまく動作します。これはボタンをクリックすることで、後でJVMが終了します。私はコマンドラインから自分のコードを実行します。たぶんそれはバージョン/プラットフォームの問題です。質問にバージョン/プラットフォームを含めてください。同じものを使用している他の人が結果をテストし報告することがあります。 – camickr

答えて

-2

現在のクラス(フォーム)を破棄して別のフォームを開くには、次のコードを使用します。ため、あなたのアプリケーションを終了System.exit(0)

 java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       dispose(); 
       new YOURCLASSTOBEOPENED().setVisible(true); 
      } catch (ClassNotFoundException ex) { 
       Logger.getLogger(YOURCURRENTCLASS.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }); 
関連する問題