我正在尝试读取动态更改的文件并在jTextArea中显示其内容。 我使用缓冲读卡器进行阅读。
我试图在控制台上显示内容,但它运行正常,但不适用于jTextArea。
我正在做类似
的事情while(true)
{
line = br.readLine();
if(line == null)
Thread.sleep();
else
System.out.println(line);
}
任何帮助将不胜感激。感谢
答案 0 :(得分:2)
2分:
Thread.sleep()
。这会阻止UI并阻止UI更新read
方法示例:
JTextArea textArea = new JTextArea();
textArea.read(new FileReader("input.txt"), "blah");
答案 1 :(得分: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();
}
});
}
}
答案 2 :(得分:1)
String line;
String textToDisplay = "";
while((line = br.readLine()) != null)
textToDisplay+=line;
textArea.setText(textToDisplay);
我使用了setText(String)
代替append(String)
,因为它会取代JTextArea
中已有的内容......从您的问题中我觉得这就是您想要做的。
答案 3 :(得分:0)
你必须设置文本区域的文本..这样做:
{
line = br.readLine();
if(line == null)
Thread.sleep();
else
textArea.append(line + "\n");
}
这将附加文件(文本末尾),这意味着每次运行时都不必担心文本被删除
应该有用,希望有所帮助