将数据从非常大的文本文件导入JTable

时间:2014-02-28 19:18:48

标签: java swing jtable

我正在创建一个应用程序来处理存储在文本文件中的大量数据。本质上,应用程序浏览.txt文件,一旦找到,应用程序需要将文件中的所有数据放入JTable中,然后我需要对数据执行一些过滤操作,然后将其导出。 .txt文件中的数据采用以下格式:

Column1 Column2 Column3 Column4 Column5 Column6 .........(there are 510 columns)
A       B       C       D       E       F 
G       H       I       J       K       L
....   ...     ...     ...    ....     ...

有数千行。每行包含双重类型数字(A,B ....均为1.3,2.0等)

我通过手动添加数组中的所有列名,然后将表的模型设置为

来设置表的列
table = new JTable();
table.setModel(new DefaultTableModel(null,columns)); 
//'columns' is a string array containing 510 names 

我把这些行设置为'null',因为我不知道如何获取该数据并将其转换为2D数组,因为这是行的格式。此外,可能有任意数量的行。我如何阅读文本文件的代码如下:

    btnBrowse.addActionListener(new ActionListener() 
    {
        public void actionPerformed(ActionEvent arg0) 
        {                       
            JFileChooser chooser = new JFileChooser();

            int option = chooser.showOpenDialog(dpaGUI.this);               
            if (option == JFileChooser.APPROVE_OPTION) 
            {
              file = chooser.getSelectedFile();
              BufferedReader in = null;
            try 
            {
                in = new BufferedReader(new FileReader(file));
            } catch (FileNotFoundException e) 
            {
                e.printStackTrace();
            }

              try 
              {
                while(in.ready())
                  {
                    //test operations performed with the retrieved text
                  }
            } 
              catch (IOException e) 
            {

                e.printStackTrace();
            }
              try 
              {
                in.close();
            } catch (IOException e) 
            {
                e.printStackTrace();
            }
            }
        }
    });  

我尝试执行一些测试操作,例如将检索到的文本拆分为“\ t”(这就是它应该如何存储在文本文件中),但到目前为止还没有帮助。文本文件还包含列的名称,因此在填充行时需要删除它们。任何建议都有助于我如何将大量数据从我的文本文件中获取到JTable中。我正在使用JTable,因为我需要对整列数据(每行有数千行)执行进一步的操作。我愿意接受不同容器的建议。 任何建议都会有帮助。非常感谢!

2 个答案:

答案 0 :(得分:1)

试一试。您可以使用接受列名称和行数的构造函数,而不是将数据设置为null。将行设置为0,然后使用addRow

DefaultTableModel(Object[] cols, int rows)

DefaultTableModel api查看更多方法和构造函数。

使用您的特定代码,您可以使用我的方法在DefaultTableModel

中创建table.setModel(model)和使用ActionListener

文件

Column1 Column2 Column3 Column4 Column5 Column6 
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L
A       B       C       D       E       F 
G       H       I       J       K       L

<强>结果

enter image description here

<强>代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TestTable5 {

    public TestTable5() {
        DefaultTableModel model = createModel("/resources/file.txt");
        JTable table = new JTable(model);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private DefaultTableModel createModel(String filePath) {
        DefaultTableModel model = null;

        try {
            BufferedReader txtReader = new BufferedReader(
                    new InputStreamReader(getClass().getResourceAsStream(filePath)));
            String header = txtReader.readLine();
            model = new DefaultTableModel(header.split("\\s+"), 0);
            String line;
            while((line = txtReader.readLine()) != null) {
                model.addRow(line.split("\\s+"));
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        return model;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestTable5();
            }
        });
    }
}

更新

您可以尝试使用JFileChooser

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.FileReader;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TestTable5 {

    public TestTable5() {
        String[] defaultCols = {"COL", "COL", "COL", "COL", "COL", "COL"};
        DefaultTableModel model = new DefaultTableModel(defaultCols, 0);
        JTable table = new JTable(model);

        JButton button = createButton(table);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new JScrollPane(table));
        frame.add(button, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JButton createButton(final JTable table) {
        JButton button = new JButton("Get File");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();
                int result = chooser.showOpenDialog(table);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File file = chooser.getSelectedFile();
                    DefaultTableModel model = createModel(file);
                    table.setModel(model);
                }
            }
        });
        return button;
    }

    private DefaultTableModel createModel(File file) {
        DefaultTableModel model = null;

        try {
            BufferedReader txtReader = new BufferedReader(
                    new FileReader(file));
            String header = txtReader.readLine();
            model = new DefaultTableModel(header.split("\\s+"), 0);
            String line;
            while ((line = txtReader.readLine()) != null) {
                model.addRow(line.split("\\s+"));
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        return model;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestTable5();
            }
        });
    }
}

答案 1 :(得分:0)

如果您认为数据集太大,请尝试实现您自己的单元格模型,而不是从AbstractTableModel派生。面向模型的方法的强大之处在于,只能从模型中请求总行数和屏幕上当前可见的单元格。因此,行数可以超过计算机内存所能容纳的数量。将数据库引擎用作后端可能是个好主意。