在往JTextArea中填充数据时,JTextArea上的滚动条也可以拖动。
解决办法:
主线程放在EDT中,fill JTextArea的操作放在另外一个线程中,这样fill操作与GUI上的操作就分离了,不会出现排除的情况
package swing.jtextarea; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; public class JTextAreaFillDemo { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JTextAreaFrame frame = new JTextAreaFrame(); frame.setTitle(frame.getClass().getSimpleName()); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setLocationRelativeTo(null); } }); } } class JTextAreaFrame extends JFrame { private static final long serialVersionUID = 8390788205754221692L; private JTextArea jtextarea; public JTextAreaFrame() { jtextarea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(jtextarea); this.add(scrollPane, BorderLayout.CENTER); fillJTextArea(); } public void fillJTextArea() { new Thread(new Runnable() {// 启动数据获取,更新显示进程 public void run() { JTextAreaFiller d = new JTextAreaFiller(jtextarea); d.fillJtextArea(); } }).start(); } }
package swing.jtextarea; import java.util.concurrent.TimeUnit; import javax.swing.JTextArea; public class JTextAreaFiller { private JTextArea jTextArea; public JTextAreaFiller(JTextArea jTextArea) { this.jTextArea = jTextArea; } public void fillJtextArea() { try { for (int i = 0; i < 10000; i++) { System.out.println("当前数据为:" + i); jTextArea.append("当前数据为:" + i + "\n"); // 调用主窗口的jtextarea进行添加数据,显示 TimeUnit.SECONDS.sleep(1); } } catch (Exception ex) { ex.printStackTrace(); } } }