java JTextArea append之后自动滚动到最后一行,不需要在swing主线程完成之后才显示

本文介绍了一种使用Java实现从Excel文件(.xlsx格式)读取数据并转换为文本输出的方法。具体步骤包括:通过输入流打开指定的.xlsx文件;判断文件类型;使用Apache POI库读取工作表中的单元格内容,并将每个单元格的内容打印到控制台;考虑了单元格可能包含的不同数据类型及其转换方式;同时处理过程中加入了线程睡眠机制以减缓读取速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	public void actionPerformed(ActionEvent e) {
		StringWriter sw = new StringWriter();
		PrintWriter pw = new PrintWriter(sw);
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				log.append("begin to convert ..." + TLSwing.newline);
				if (txt_source.getText().equals("")) {
					log.append("please input source file...");
				} else {
					log.append("begin to convert ..." + txt_source.getText() + TLSwing.newline);
					file_source = new File(txt_source.getText());
					try {
						in = new FileInputStream(file_source);
						if (file_source.getName().endsWith("xlsx")) {
							workbook = new XSSFWorkbook(in);
							XSSFSheet sheet = workbook.getSheetAt(0);
							Sheet sheet2 = workbook.getSheetAt(0);
							for (Row row : sheet2) {
								if (row.getRowNum() != 0) {
									for (Cell cell : row) {
										// log.append(getCellValue(sheet.getRow(2).getCell(2)));
										log.append(getCellValue((XSSFCell) cell) + TLSwing.newline);
										try {
											Thread.currentThread().sleep(100);
										} catch (InterruptedException e) {
											// TODO Auto-generated catch block
											e.printStackTrace(pw); 
											log.append("InterruptedException"+TLSwing.newline+sw.toString()+TLSwing.newline);
										}
									}
								}

							}

						} else {

						}
					} catch (IOException e1) {
						e1.printStackTrace(pw); 
						log.append("IOException"+TLSwing.newline+sw.toString()+TLSwing.newline);
					} finally {
						if (in != null) {
							try {
								in.close();
							} catch (IOException e2) {
								e2.printStackTrace(pw); 
								log.append("IOException"+TLSwing.newline+sw.toString()+TLSwing.newline);
							}
						}
					}
				}
			}
		}).start();
	}




要实现实时刷新JTextArea,可以使用SwingWorker类来完成SwingWorker是一个抽象类,可以在后台线程中执行长时间运行的任务,并在完成后更新用户界面。 以下是一个简单的示例代码,用于在JTextArea中实时显示添加的内容: ``` import javax.swing.*; import java.awt.BorderLayout; public class RefreshTextAreaDemo extends JFrame { private JTextArea textArea; public RefreshTextAreaDemo() { textArea = new JTextArea(10, 30); JScrollPane scrollPane = new JScrollPane(textArea); getContentPane().add(scrollPane, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); // 启动SwingWorker线程 new AppendTextWorker().execute(); } // SwingWorker实现类 private class AppendTextWorker extends SwingWorker<Void, String> { @Override protected Void doInBackground() throws Exception { // 模拟添加内容 for (int i = 0; i < 10; i++) { Thread.sleep(1000); publish("Hello, World! " + i + "\n"); } return null; } @Override protected void process(java.util.List<String> chunks) { // 添加内容JTextArea for (String chunk : chunks) { textArea.append(chunk); } } } public static void main(String[] args) { new RefreshTextAreaDemo(); } } ``` 在这个例子中,我们创建了一个JFrame和一个JTextArea,并使用SwingWorker类的子类AppendTextWorker来模拟向JTextArea中添加内容。在AppendTextWorker类中,我们使用doInBackground方法来执行模拟的长时间任务,并使用publish方法在后台线程中将内容添加到chunks列表中。在process方法中,我们将chunks列表中的内容逐一添加到JTextArea中,从而实现了JTextArea的实时刷新。 当然,如果你只需要在后台线程中更新JTextArea内容,而需要实时刷新,也可以使用SwingUtilities.invokeLater方法来更新界面。例如,可以使用以下代码将内容添加到JTextArea中: ``` SwingUtilities.invokeLater(new Runnable() { public void run() { textArea.append("Hello, World!\n"); } }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值