2016-09-29 8 views
-1

を実行している間、私はこのコードを実行する二つのボタンでJFramePanelを持っている:私は、コードの実行を開始押すと、私はそれが スタートを停止していない停止押したときにキルのJava proccess whileループ

public void runProc(){ 

     while(true){ 

      System.out.println("Running..."); 
      PrintWriter outputStream = null; 

      try { 
       outputStream = new PrintWriter (FILENAME); 
      } 

      catch (FileNotFoundException e) { 
       try { 
        Process failedToWriteFile = Runtime.getRuntime().exec(DIALOGBOX); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       e.printStackTrace(); 
      } 

      outputStream.println("hello"); 
      outputStream.close(); 
      System.out.println(""); 

      try { 
       TimeUnit.SECONDS.sleep(2); 
      } 

      catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      Path d= Paths.get(FILENAME); 

      try { 
       Files.delete(d); 
      } 

      catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      try { 
       TimeUnit.SECONDS.sleep(3); 
      } 

      catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void killProc(){ 

     System.exit(0); 

    } 

ボタンはクリックされたままで、停止ボタンは有効ではありません 何が間違っていますか?

+0

どのように我々はこれまでに、なぜあなたの知っておくべきことボタンは何かをしていますか?あなたの質問に答えるために、ボタン/パネルの背後にあるコードを見る必要があると思いませんか?あなたはここに魔法使いがいると思いますか? – GhostCat

答えて

1

ボタンをクリックするようなGUIアクションを処理するスレッドは1つだけです。このスレッドは作業を終了していないが、GUIはフリーズして他の入力に反応しない。

もっと長いタスクを開始するには、SwingWorkerのような余分なスレッド内でボタンを実行し、このスレッドの開始点のみをGUIスレッド(例えばactionPerformedメソッド)内で行う必要があります。

+0

実行中のコードをどのように終了できますか? –

+0

私はSwingWorkerを使ってくれてありがとう - それは完璧に動作します –

0

私は、開始ボタンがイベントディスパッチスレッド上で実行されていることを意味するrunProcを直接呼び出していると仮定しています。 このスレッドはwhile(真)ループでスタックされ、決してアプリケーションに戻ることはありません。私。停止ボタンは決して走る機会を与えない。

あなたのスタートボタンではなくEDTとブール変数スタートの外側のメソッドを呼び出すとにSystem.exit対スレッドを停止するSwingWorkerのとSwingUtilitiesを使用する必要があります

(0)

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

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

    public class TestProc{ 

    boolean isRunning = false; 

    public TestProc(){ 
     JFrame f = new JFrame(); 
     JButton b = new JButton("Start"); 

     b.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       new SwingWorker<Void, Void>() { 

        public Void doInBackground() { 
         if(!isRunning){ 
          isRunning = true; 
          runProc(); 
         } 
         return null; 
        } 
       }.execute(); 
      } 
     }); 

     JButton b1 = new JButton("End"); 
     b1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         killProc(); 
        } 
       }); 
      } 
     }); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setContentPane(new JPanel()); 
     f.getContentPane().add(b); 
     f.getContentPane().add(b1); 
     f.pack(); 
     f.setVisible(true); 

    } 

    public void runProc(){ 
     while(isRunning){ 
      System.out.println("."); 
      try { Thread.sleep(100); } catch (InterruptedException e) {} 
     } 
    } 

    public void killProc(){ 
     isRunning = false; 
     System.out.println("DEAD!"); 
    } 

    public static void main(String args[]){ 
     new TestProc(); 
    } 
}