由于大小的原因,您肯定希望在后台加载文件,以避免阻塞事件调度线程;SwingWorker
是一个常见的选择。请考虑更新 a 并在 a 的行中显示文本行,而不是使用 。这提供了几个优点:Document
TableModel
JTable
结果将立即开始出现,并且将减少感知到的延迟。
JTable
使用蝇量级模式进行渲染,该模式可以很好地扩展到数兆字节、百万行的范围。您可以在读取输入时对其进行分析,以创建任意列结构。
您可以使用
TablePopupEditor
将焦点放在一行上。
附录:为方便起见,以下示例使用。要减少开销,请扩展和管理 或 ,如下所示。该示例显示不确定的进度;此处显示了显示中间进度的更改。DefaultTableModel
AbstractTableModel
List<String>
List<RowData>
法典:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
/**
* @see https://stackoverflow.com/a/25526869/230513
*/
public class DisplayLog {
private static final String NAME = "/var/log/install.log";
private static class LogWorker extends SwingWorker<TableModel, String> {
private final File file;
private final DefaultTableModel model;
private LogWorker(File file, DefaultTableModel model) {
this.file = file;
this.model = model;
model.setColumnIdentifiers(new Object[]{file.getAbsolutePath()});
}
@Override
protected TableModel doInBackground() throws Exception {
BufferedReader br = new BufferedReader(new FileReader(file));
String s;
while ((s = br.readLine()) != null) {
publish(s);
}
return model;
}
@Override
protected void process(List<String> chunks) {
for (String s : chunks) {
model.addRow(new Object[]{s});
}
}
}
private void display() {
JFrame f = new JFrame("DisplayLog");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);
JProgressBar jpb = new JProgressBar();
f.add(jpb, BorderLayout.NORTH);
f.add(new JScrollPane(table));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
LogWorker lw = new LogWorker(new File(NAME), model);
lw.addPropertyChangeListener((PropertyChangeEvent e) -> {
SwingWorker.StateValue s = (SwingWorker.StateValue) e.getNewValue();
jpb.setIndeterminate(s.equals(SwingWorker.StateValue.STARTED));
});
lw.execute();
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
new DisplayLog().display();
});
}
}
我会把问题分开。
第一个是模型 - 文档构建速度
第二个是文档呈现 - 构建视图树来表示文档。
一个问题是你是否需要像关键字着色这样的字体效果?
恕我直言,通过EditorKit.read()阅读文件应该很快,即使对于大文件也是如此。我会使用 PainDocument 来实现此目的,并检查纯模型是否为您的应用程序构建得足够快。如果是,只需使用文档作为模型即可。如果不实现你自己的文档接口,因为 AbstractDocument 有很多更新处理方法(例如 writeLock)。
当我们的文档加载速度足够快时,我们必须解决文档呈现问题。默认情况下,javax.swing.text中使用的视图非常灵活。它们被设计为要扩展的基类 - 因此有很多我们不需要的代码。例如测量。
对于功能,我会使用等宽字体,我们不需要换行,因此视图的测量速度很快=最长行字符数*字符数。
高度也是字符高度 * 行数。
因此,我们的PLainTextViewReplacement非常快。此外,我们不必渲染整个视图,而只需在滚动窗格中显示一个片段即可。因此,渲染速度可能快得多。
当然,应该有很多工作来提供正确的插入符号导航,选择等。