2014-02-10 66 views
0

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

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

我做这样的事情

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

任何帮助,将不胜感激。由于

回答

2

不要使用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(); 
      } 
     }); 
    } 
} 

enter image description here

+0

谢谢吨..它帮助:) – Pooja

0

你必须设置文本的文本area..try这样做:

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

这将追加(把在结束文本)的文件,这意味着你将不必担心文本中每次删除运行

应该工作,希望它有助于

+0

我做同样的事情...它的工作原理在正常情况下,但睡眠它停止工作! – Pooja

+0

嗯,我对sleep()不是很熟悉,但是从我记忆中,睡眠应该停止正在发生的当前线程。所以这可能是它不工作的原因。只要取出if(line == null)Thread.sleep();并查看是否有帮助 – user2277872

+0

if(line == null)让我等待添加新的日志条目,以便动态读取它。 – Pooja

1
String line;  
String textToDisplay = ""; 
while((line = br.readLine()) != null) 
    textToDisplay+=line; 
textArea.setText(textToDisplay); 

我用setText(String)代替append(String)因为它会取代世界卫生大会t已经在JTextArea ...从你的问题我觉得这就是你想要做的。

2

2点:

  • 不要叫Thread.sleep()在EDT。这将阻止用户界面和防止UI更新
  • 的JTextArea具有read方法,它允许将文件加载

例子:

JTextArea textArea = new JTextArea(); 
textArea.read(new FileReader("input.txt"), "blah"); 
+0

我需要停止读取文件,当它到达结束等待新的写入答复日志不断被写入 – Pooja