问题:java swing 图形界面程序,拖了一个JTextArea出来,程序中有很多地方调用JTextArea中的append这个方法不断往文本域结尾处追加数据,但是程序每次运行,总是在程序运行完成时才将最终的结果一股脑的填在该文本域上,中间运行时根本不对文本域添加任何数据。
解决方法:
JTextArea若只用append()函数会等到整个类方法运行完后才会将添加的内容统一添加到文本框中显示,之前只会暂存于缓存中,
所以及时添加并显示文本要有两步:
利用JTextArea从类 javax.swing.JComponent 继承来的方法paintImmediately来立即刷新JTextArea即可。
JTextArea textArea=new JTextArea(); textArea.append("进程2输出完毕!\n");//紧跟在此后面加上下面语句即可 textArea.paintImmediately(textArea.getBounds());
其中getBounds()方法是获得组件的边界,API中对getBounds方法是这样说的:
public Rectangle getBounds() 获得此对象的边界,用 Rectangle 对象的形式表示它。
这些边界了指定此对象的宽度、高度和相对其父对象的位置。
package swing.jtextarea; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.TimeUnit; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; /*2015-7-13*/ public class JTextareaDemo { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JTextAreaJFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setLocationRelativeTo(null); } }); } } class JTextAreaJFrame extends JFrame { private static final long serialVersionUID = -1886518634127203315L; private static final int DEFAULT_WIDTH = 400; private static final int DEFAULT_HEIGHT = 200; private JTextArea textarea; public JTextAreaJFrame() { setTitle(getClass().getSimpleName()); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); textarea = new JTextArea(); textarea.setLineWrap(true); textarea.setWrapStyleWord(true); add(new JScrollPane(textarea), BorderLayout.CENTER); JButton btn = new JButton("Print"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { appendData(); } catch (InterruptedException e1) { e1.printStackTrace(); } } }); JPanel southPanel = new JPanel(); southPanel.add(btn); add(southPanel, BorderLayout.SOUTH); } private void appendData() throws InterruptedException { for (int i = 0; i < 10; i++) { textarea.append(i + ":append!\n"); // int length = textarea.getText().length(); // textarea.setCaretPosition(length); textarea.paintImmediately(textarea.getBounds()); TimeUnit.SECONDS.sleep(1); } } }