资源里有主要两个东西:1.自己编写的MyCurveManagementSystem.java,可以载入文本文件。载入小文本文件没有问题,但是载入较大(90MB)的文本文件,界面就会失去响应(用户名、密码:admin,admin)可是自己明明使用了EventQueue.invokeLater这个方法来处理读取文件和更新TextArea操作2.SwingWorkerTest.java,core java上的示例,载入大文本文件完全无压力3.还有一个问题,双击我的MyCurveManagementSystem标题栏,为什么窗口缩成一点点。
http://download.csdn.net/detail/zhrubin/5497013

解决方案 »

  1.   

    我用了EventQueue.invokeLater,将其作为一个线程放入队列
    还试过把读入文本的操作,new Thread start,还是有问题
      

  2.   

    好吧,写的非常多,还有很多无关代码,我贴一下关键代码,将文件中的内容读入到textarea
    ManagementFrame.this.remove(curvePanel);
    ManagementFrame.this.add(filePanel,BorderLayout.CENTER);
    ManagementFrame.this.validate();

    int result = fileChooser.showOpenDialog(ManagementFrame.this);
    if(result == JFileChooser.APPROVE_OPTION){
    final String name = fileChooser.getSelectedFile().getPath();
    final File file = fileChooser.getSelectedFile();
    ManagementFrame.this.setTitle("打开文件"+name);

    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    try {
    //该方法有更新GUI的语句,应放到事件分配进程
    //但是该程序缺点很明显,打开大文件(90MB)的时候,界面失去响应
    //更好的改进,请参见jdk中的SwingWorker类的使用
    loadFileToTextArea(file, textArea);
    } catch (FileNotFoundException e) {
    ManagementFrame.this.statusLine.setText("找不到"+name+"文件");
    e.printStackTrace();
    } catch (IOException e) {
    ManagementFrame.this.statusLine.setText("读取文件"+name+"错误");
    e.printStackTrace();
    }

    }
    });

    System.out.println("end");
    }
    }

    private void loadFileToTextArea(File file, JTextArea textArea) throws IOException,FileNotFoundException{
    StringBuilder sb = new StringBuilder();
    InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), "GBK");
    BufferedReader br = new BufferedReader(inputStreamReader);
    String s;
    String separator = System.getProperty("line.separator");

                while( (s = br.readLine()) != null )  {
                 sb.append(s).append(separator);
                }
                textArea.setText(sb.toString());
    }
      

  3.   

    我的loadFileToTextArea是放在时间分配线程里执行的,按理说应该可以操作gui界面才对啊
      

  4.   

    既然想要面对大文件,那么现在文件才90M,如果是900M,9G呢?
    想想你的代码载入有什么问题。
      

  5.   

    90MB这个使用了StringBuilder,要文件中所有行连接完完才能显示,不过这块应该不是瓶颈,因为
    SwingWorker那个例子中
     public StringBuilder doInBackground() throws IOException, InterruptedException
          {
             int lineNumber = 0;
             Scanner in = new Scanner(new FileInputStream(file));
             while (in.hasNextLine())
             {
                String line = in.nextLine();
                lineNumber++;
                text.append(line);
                text.append("\n");
                ProgressData data = new ProgressData();
                data.number = lineNumber;
                data.line = line;
                publish(data);
                Thread.sleep(1); // to test cancellation; no need to do this in your programs
             }
             return text; @Override
          public void done()
          {
             try
             {
                StringBuilder result = get();
                textArea.setText(result.toString());
                statusLine.setText("Done");
             }
    其中text是一个StringBuilder,也是采用的这种策略,但并没有死掉
    而且我试过读一行更新一次textArea这个策略也不行
    900MB必然采取分段读取、部分加载的策略
      

  6.   

    大概了解为什么了
    次要原因,loadFileToTextArea耗时较久(其实也不久),不应该将这个方法放入事件分配线程
    主要原因,那个90MB文件太大,有上千万行,如果对整个进行更新的话,必然挂掉。而Core java中的
    SwingWorker那个例子,我研究了一下,是读一行,调用事件分配线程更新一下GUI,所以没问题改进设想:
       loadFileToTextArea放到一个工作线程中,在这个工作线程想办法每读一行,就把读取的数据通知
    到更新界面的事件分配线程。如何通知?这涉及到了工作线程和事件分配线程对共享资源的访问,或许采用
    阻塞队列是一个好办法。当然直接使用SwingWorker这个java类库也行,人家类库已经把这些东西考虑好了。看来学习多线程,还有很长的路要走。hoho
      

  7.   

    SwingWorker这个例子中的
     publish(data);
    就是通知事件分配线程负责更新GUI
    以前没理解,现在才知道