java - 如何阻止 jTable 一次添加所有内容?

标签 java swing jtable

基本上,我有一种方法可以从文本文件中读取数据并将行添加到 jTable。这已得到处理,一切正常。我要的是加行效果。我希望 jTable 逐行添加而不是一次添加所有行。 我使用 java.swing.Timer 找到了类似的解决方案,但它对我不起作用。

所以下面我有一个方法可以从文本文件中读取,添加到 jTable 和计时器以暂停每一行的插入行过程(我的预期目的)。计时器工作正常,但不是延迟行,而是延迟整个表。所以当我点击按钮时,表格等待 2 秒并吐出整行。我怎样才能像 peekillet 的更新#2 那样实现逐行添加效果。任何帮助将不胜感激!

 private void addActionPerformed(java.awt.event.ActionEvent evt) {     
    addData();  
 }  

public void addData(){
    Timer timer = new Timer(2000, new ActionListener() {
       public void actionPerformed(ActionEvent ae) {
          try {
                FileInputStream fstream = new FileInputStream("\\data.txt");
                BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

                String line;
                DefaultTableModel model = (DefaultTableModel) resultTable.getModel();

                while((line = br.readLine()) != null){  
                    model.addRow(new Object[]{line});
                    //System.out.println(strLine);
                 }
                fstream.close();

             } catch (FileNotFoundException ex) {
                Logger.getLogger(PIIFrame.class.getName()).log(Level.SEVERE, null, ex);
              } catch (IOException ex) {
                Logger.getLogger(PIIFrame.class.getName()).log(Level.SEVERE, null, ex);
              }
             repaint();
           }

       });  

      timer.setRepeats(false);
      timer.start();   
}

引用:peeskillet's solution

最佳答案

Timer 的操作处理程序在 EDT 上执行,这意味着您在读取文件时会阻止 EDT。在这种情况下,计时器唯一做的就是将文件读取延迟 2 秒。

您不需要计时器来执行此操作,您可以改为执行类似的操作。

public void addData(){
    final DefaultTableModel model = (DefaultTableModel) resultTable.getModel();
    new Thread(new Runnable(){
        public void run(){
            FileInputStream fstream = null;
            try {
                fstream = new FileInputStream("\\data.txt");
                BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
                String line;
                while((line = br.readLine()) != null){
                    final String ln = line;
                    SwingUtilities.invokeAndWait(new Runnable(){
                        // run on EDT thread.
                        public void run(){
                            model.addRow(new Object[]{ln});
                        }
                    }); 
                    synchronized(Thread.currentThread()){
                        Thread.currentThread().wait(2000);// pause for 2 second.
                    }
                }
            } catch (FileNotFoundException ex) {
                ...
            } catch (IOException ex) {
                ....
            } finally {
                if(fstream!=null){
                    try{
                        fstream.close();
                    }catch (IOException e) {
                        ....
                    }
                }
            }
        }
    }).start();
}

关于java - 如何阻止 jTable 一次添加所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37444558/

相关文章:

java - 在 EDT 之外执行长时间运行的操作的正确方法是什么?

java - 在 JTable 中对 int 进行排序

java - java/maven如何在运行时解决依赖冲突

java - 你如何使用 math.random 生成随机整数?

java - 在 JTable 中随机选择多行

java - 将JComboBox添加到JTable : ComboBoxes in different rows are not independent

java - 单击按钮时选择复选框 JTable 的值

java - 以编程方式控制 TPTP 分析

java - jUnit 和 Mockito - 模拟 "when"触发验证

java - Java程序在Windows上运行时不显示Unicode字符