Java 在JTextArea中加载内容
我试图理解延迟加载。假设我有一个大文件,需要加载到JScrollPane的文本区域中。因为任何用户在任何时候都看不到整个文件,所以我现在一次加载70行以使其可见。然后,使用滚动事件,我决定何时加载下一个内容。我检查用户在滚动时是否到达末尾,当滚动距离末尾2个单位时,我从文件中读取接下来的70条记录。我正在做这样的事情:Java 在JTextArea中加载内容,java,swing,lazy-loading,large-data,Java,Swing,Lazy Loading,Large Data,我试图理解延迟加载。假设我有一个大文件,需要加载到JScrollPane的文本区域中。因为任何用户在任何时候都看不到整个文件,所以我现在一次加载70行以使其可见。然后,使用滚动事件,我决定何时加载下一个内容。我检查用户在滚动时是否到达末尾,当滚动距离末尾2个单位时,我从文件中读取接下来的70条记录。我正在做这样的事情: public class LazyLoad { private static JTextArea txt; private static JScrollPane
public class LazyLoad {
private static JTextArea txt;
private static JScrollPane jscp;
private static final int MAX_COUNT = 70;
private static JFrame mainWindow = new JFrame();
private static FileReader fr;
private static BufferedReader br;
private static void createWindow(String title) {
mainWindow.setTitle(title);
mainWindow.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
mainWindow.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
txt = new JTextArea();
jscp = new JScrollPane(txt);
mainWindow.add(jscp);
try{
fr = new FileReader("src//f.txt");
br = new BufferedReader(fr);
} catch (Exception e ) {
}
loadText();
JScrollBar vs = jscp.getVerticalScrollBar();
int max = vs.getMaximum();
int ext = vs.getModel().getExtent();
vs.addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
// TODO Auto-generated method stub
System.out.println("Scroll value : " + e.getValue());
// scroll is 2 units away from the end
if ( vs.getMaximum() -( vs.getModel.getExtent() + e.getValue() ) <= 2 ) {
System.out.println("Loading more Text in the textarea");
// read next 70 lines.
loadText();
}
}
});
mainWindow.setVisible(true);
}
// This function is used to read next 70 lines and append them in the textarea.
private static void loadText() {
try {
String line = "" ;
int count = MAX_COUNT;
while(count>0) {
line = br.readLine();
if ( line == null )
break;
txt.append(line);
txt.append("\n");
count--;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
createWindow("Test for lazy loading");
}
}
公共类懒虫负载{
私有静态JTextArea txt;
私有静态JScrollPane jscp;
私有静态最终整数最大计数=70;
私有静态JFrame主窗口=新JFrame();
私有静态文件阅读器;
专用静态缓冲读取程序br;
私有静态void createWindow(字符串标题){
主窗口。设置标题(标题);
setExtendedState(java.awt.Frame.MAXIMIZED_两者);
addWindowListener(新的WindowAdapter(){
@凌驾
公共无效窗口关闭(WindowEvent e){
//TODO自动生成的方法存根
系统出口(0);
}
});
txt=新的JTextArea();
jscp=新的JScrollPane(txt);
main window.add(jscp);
试一试{
fr=新文件读取器(“src//f.txt”);
br=新的缓冲读取器(fr);
}捕获(例外e){
}
loadText();
JScrollBar vs=jscp.getVerticalScrollBar();
int max=vs.getmax();
int ext=vs.getModel().getExtent();
vs.addAdjustmentListener(新的AdjustmentListener(){
@凌驾
公共无效调整值已更改(调整事件e){
//TODO自动生成的方法存根
System.out.println(“滚动值:+e.getValue());
//滚动距离末端2个单位
如果(vs.getMaximum()-(vs.getModel.getExtent()+e.getValue())0){
line=br.readLine();
如果(行==null)
打破
追加(行);
txt.append(“\n”);
计数--;
}
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
createWindow(“延迟加载测试”);
}
}
上面的代码在滚动距离结束2个单位时读取接下来的70行。但它将所有附加在textarea中的文本保留在内存中。比如说,如果我有2 GB的文件,我可以检测文件的结束并加载下一组要读取的行。但是当向上滚动时,如何实现类似的任务
我浏览了其他链接,说实现一个文档模型,谁想在TextArea中加载2GB或大文件。请看,我只是想通过这个例子来理解延迟加载。这对于需要自定义编辑器或查看器来处理大文件的应用程序是有用的。我认为使用JTextArea b不容易做到这一点e因为滚动条只会获取当前加载的文本的大小。您可以尝试获取文本文件的行数,并在当前加载的文本前后添加空行,以匹配原始文本的大小。1)如何知道公式得出的值小于2。应将计算分配给一个变量,然后测试该变量。通过这种方式,您可以显示该值以确保其合理。2)计算中使用的变量应在侦听器中确定。如果将帧的大小调整为示例。3)我不知道从何处删除现有文本,因此我肯定希望最大值会发生变化。4)加载文本时,侦听器会在加载文本时触发。可能需要在添加文本时删除侦听器?@camickr根据您的观点,我做了一个小编辑,更新了侦听器中的范围和最大值,其中现在似乎显示了预期的行为。但是,当向上滚动时,如何惰性地加载内容。目前,所有内容都位于文本区域内,这将占用大量内存用于大型文件。@在这种情况下,Grunzwanzling的内存消耗不等于文件大小?大型文件可能有大量行。否,y行的长度相同,但字符的长度不同。内存使用量将大大减少