2014-01-20 163 views
0

我是新来的Java 我有数据输出端口的输出字符串的要求内停止循环,直到我收到的数据端口上的绳子,然后采取其他行动。 撇开COM端口的问题,就目前而言,我想流简单地使用按钮来启动然后停止模拟数据,和我惨遭失败。 这是我创建的代码。我想开始输出到文本区域,直到我按下停止按钮。我怎么可以就一个JFrame

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JTextArea; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.util.concurrent.TimeUnit; 


public class WriteToWindow extends JFrame { 

    private JPanel contentPane; 
    private final static String newline = "\n"; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        WriteToWindow frame = new WriteToWindow(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public WriteToWindow() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     // try adding final 
     final JTextArea textArea = new JTextArea(); 
     textArea.setRows(10); 
     textArea.setBounds(27, 23, 377, 142); 
     contentPane.add(textArea); 

     JButton btnStart = new JButton("Start"); 
     btnStart.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
      // start writing to the text area 
       int i = 1; 
       textArea.append("You clicked start" + newline); 
       do { 
        textArea.append("Iteration " + Integer.toString(i) + newline); 
        i++; 
        // wait a second 
        try { 
         TimeUnit.SECONDS.sleep(1); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } while (true);// forever 
      } 
     }); 
     btnStart.setBounds(25, 188, 89, 23); 
     contentPane.add(btnStart); 

     JButton btnStop = new JButton("Stop"); 
     btnStop.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //stop writing data to the text area 
       textArea.append("You clicked stop" + newline); 
       } 
     }); 
     btnStop.setBounds(151, 188, 89, 23); 
     contentPane.add(btnStop); 
    } 
} 

回答

1

这种做法是行不通的,因为它阻止事件调度线程,阻止它处理它可能提出的任何新的事件,其中包括repaint事件。这基本上会挂起你的程序。

相反,你需要在循环的执行关闭加载到某种背景Thread的。

尽管您当然可以使用Thread,但您应该负责确保不违反Swing的单线程本质,即确保在事件分派的上下文中执行任何UI更新线。

为此,我建议使用SwingWorker,因为它可以让你做后台工作(独立Thread),同时提供易于使用的功能同步更新回EDT

看看Concurrency in SwingSwingWorker特别是...