2016-09-29 71 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操作。雖然這個線程還沒有完成他的工作,但GUI被凍結並且不會對其他輸入做出反應。

如果我想要一個按鈕來啓動一個更長的任務,它應該在像SwingWorker這樣的額外線程內完成,並且只有該線程的開始應該在GUI線程內完成(例如actionPerformed方法)。

+0

那麼如何終止正在運行的代碼呢? –

+0

明白了!謝謝我使用了SwingWorker - 它的工作非常完美 –

0

我假設開始按鈕直接調用runProc,這意味着它在Event Dispatch線程上運行。 然後,此線程停留在while(true)循環中,永遠不會返回到應用程序。即停止按鈕從來沒有機會運行。

你的啓動按鈕而應使用SwingWorker類和SwingUtilities類的調用EDT和布爾變量啓動之外的方法和停止線程VS System.exit(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(); 
    } 
}