利用SwingWorker,从文件中读取内容,显示到JTextArea中

本文介绍了一个使用Java SwingWorker组件实现的简单文件阅读器应用程序。该应用能够在不阻塞UI线程的情况下读取文件内容,并将进度更新到GUI中。支持取消文件读取操作。

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

class SwingWorkerFrame extends JFrame {
	public SwingWorkerFrame() {
		chooser = new JFileChooser();
		chooser.setCurrentDirectory(new File("."));
		
		textArea = new JTextArea();
		add(new JScrollPane(textArea));
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		
		statusLine = new JLabel(" ");
		add(statusLine, BorderLayout.SOUTH);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu fileMenu = new JMenu("File");
		menuBar.add(fileMenu);
		
		openItem = new JMenuItem("Open");
		fileMenu.add(openItem);
		openItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				int result = chooser.showOpenDialog(null);
				if(result == JFileChooser.APPROVE_OPTION) {
					textArea.setText("");
					openItem.setEnabled(false);
					textReader = new TextReader(chooser.getSelectedFile());
					textReader.execute();
					cancelItem.setEnabled(true);
				}
			}
		});
		
		cancelItem = new JMenuItem("Cancel");
		fileMenu.add(cancelItem);
		cancelItem.setEnabled(false);
		cancelItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				textReader.cancel(true);
			}
		});
	}
	
	private class ProgressData {
		public int number;
		public String line;
	}
	
	private class TextReader extends SwingWorker<StringBuilder, ProgressData> {
		
		public TextReader(File file) {
			this.file = file;
		}
		
		@Override
		public StringBuilder doInBackground() throws Exception {
			int lineNumber = 0;
			Scanner in = new Scanner(new FileInputStream(file));
			
			while(in.hasNextLine()) {
				String line = in.nextLine();
				lineNumber++;
				text.append(line);
				text.append("\n");
				
				ProgressData data = new ProgressData();
				data.number = lineNumber;
				data.line = line;
				
				publish(data);
				Thread.sleep(1);
			}
			
			return text;
		}
		
		@Override
		public void process(List<ProgressData> data) {
			if(isCancelled()) {
				return;
			}
			
			StringBuilder b = new StringBuilder();
			statusLine.setText("" + data.get(data.size() - 1).number);
			for(ProgressData d : data) {
				b.append(d.line);
				b.append("\n");
			}
			
			textArea.append(b.toString());
		}
		
		@Override
		public void done() {
			try {
				StringBuilder result = get();
				textArea.setText(result.toString());
				statusLine.setText("Done");
			} catch (InterruptedException e) {
			} catch (CancellationException e) {
				textArea.setText("");
				statusLine.setText("Cancelled");
			} catch(ExecutionException e) {
				statusLine.setText("" + e.getCause());
			}
			
			cancelItem.setEnabled(false);
			openItem.setEnabled(true);
		}
		
		private File file;
		private StringBuilder text = new StringBuilder();
	}
	
	private JFileChooser chooser;
	private JTextArea textArea;
	private JLabel statusLine;
	private JMenuItem openItem;
	private JMenuItem cancelItem;
	private SwingWorker<StringBuilder, ProgressData> textReader;
	
	public static final int DEFAULT_WIDTH = 450;
	public static final int DEFAULT_HEIGHT = 350;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值