读取日志文件并在jTextArea中显示

我正在尝试读取动态更改的文件并在jTextArea中显示其内容。 我正在使用缓冲读卡器进行阅读。

我试图在控制台上显示内容,它工作正常,但不适用于jTextArea。

我正在做类似的事情

while(true) { line = br.readLine(); if(line == null) Thread.sleep(); else System.out.println(line); } 

任何帮助,将不胜感激。 谢谢

不要使用Thread.sleep() ,你将阻止EDT。 如果要对结果进行“动画处理” ,请使用javax.swing.Timer 。 只需读取计时器每次迭代的每一行,直到它到达文件末尾,然后停止计时器

 timer = new Timer(100, new ActionListener() { public void actionPerformed(ActionEvent e) { String line; try { if ((line = reader.readLine()) != null) { textArea.append(line + "\n"); } else { ((Timer) e.getSource()).stop(); } } catch (IOException ex) { Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex); } } }); 

测试这个程序。 我认为它的工作方式与你想要的一样。

 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.Timer; public class ReadFile { File file = null; BufferedReader reader = null; private Timer timer = null; private JTextArea textArea; private JTextField jtfFile; private String fileName; private JButton browse; private JFrame frame; public ReadFile() { textArea = new JTextArea(25, 60); frame = new JFrame("Show Log"); browse = new JButton("Browse"); browse.addActionListener(new ShowLogListener()); jtfFile = new JTextField(25); jtfFile.addActionListener(new ShowLogListener()); timer = new Timer(100, new ActionListener() { public void actionPerformed(ActionEvent e) { String line; try { if ((line = reader.readLine()) != null) { textArea.append(line + "\n"); } else { ((Timer) e.getSource()).stop(); } } catch (IOException ex) { Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex); } } }); JPanel panel = new JPanel(); panel.add(new JLabel("File: ")); panel.add(jtfFile); panel.add(browse); frame.add(panel, BorderLayout.NORTH); frame.add(new JScrollPane(textArea), BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } private class ShowLogListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); int result = chooser.showOpenDialog(frame); if (result == JFileChooser.APPROVE_OPTION) { file = chooser.getSelectedFile(); fileName = file.getName(); jtfFile.setText(fileName); try { reader = new BufferedReader(new FileReader(file)); } catch (FileNotFoundException ex) { Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex); } timer.start(); } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { new ReadFile(); } }); } } 

在此处输入图像描述

2分:

  • 不要在EDT中调用Thread.sleep() 。 这会阻止UI并阻止UI更新
  • JTextArea有一个允许加载文件的read方法

例:

 JTextArea textArea = new JTextArea(); textArea.read(new FileReader("input.txt"), "blah"); 
 String line; String textToDisplay = ""; while((line = br.readLine()) != null) textToDisplay+=line; textArea.setText(textToDisplay); 

我使用了setText(String)而不是append(String)因为它将替换JTextArea已经存在的JTextArea ……从你的问题我觉得这就是你想要做的。

你必须设置文本区域的文本..这样做:

 { line = br.readLine(); if(line == null) Thread.sleep(); else textArea.append(line + "\n"); } 

这将附加(文本末尾)文件,这意味着你不必担心每次运行时都会删除文本

应该工作,希望它有所帮助