我正在创建一个应用程序来处理存储在文本文件中的大量数据。本质上,应用程序浏览.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,因为我需要对整列数据(每行有数千行)执行进一步的操作。我愿意接受不同容器的建议。 任何建议都会有帮助。非常感谢!
答案 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
<强>结果强>
<强>代码强>
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派生。面向模型的方法的强大之处在于,只能从模型中请求总行数和屏幕上当前可见的单元格。因此,行数可以超过计算机内存所能容纳的数量。将数据库引擎用作后端可能是个好主意。