2016-09-29 74 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(); 
    } 
}