[英]JTable refresh data from txt file
I want to create a file reader that shows data in a JTable. 我想创建一个在JTable中显示数据的文件阅读器。 The data in the file are separated by ',' , ';'
文件中的数据用',',';'分隔 , or '.'
, 要么 '。' characters.
字符。 Here's a small part of it
这只是其中的一小部分
txt File txt文件
12345;Βασ.ίλειος;Τζης;Περικλής;Μαρία;28/06/1984;α1
12346;Βασίλ.ειος;Τζόγλου;Πέτρος;Μαρία;29/06/1984;α1
12347;Βα.σίλειος;Τζόπουλος;Παύ.λος;Μαρία;30/06/1984;α1
12348;Βασίλ.ειος;Τζάκης;Πανα.γιώτης;Μαρία;27/06/1984;α1
I open those records with a default separator (';') as shown in the picture below 我使用默认分隔符(';')打开这些记录,如下图所示
When I try to select another separator, the program have to read the file again and then separate data with the new separator. 当我尝试选择另一个分隔符时,程序必须再次读取文件,然后使用新的分隔符分隔数据。 I can see that data cannot be refreshed after all.
我可以看到数据毕竟无法刷新。 After urging, I put all essential code into one class in order to be runnable.
在敦促之后,我将所有基本代码都放在一个类中以便可以运行。 Plus, I use openCSV.
另外,我使用openCSV。
public class NewClass extends JFrame{
private CSVReader reader;
private DefaultTableModel defaultTableModel;
private final Handle handle;
private final List<String> studentColumnNames;
private FileInputStream fileInputStream;
private InputStreamReader fileReader;
private int numberOfColumns, numberOfRows;
private final JComboBox split;
private final JTable dataDemoTable;
private String[] nextLine;
private String[][] rowData;
CharsetDecoder UTF8_CHARSET;
Container container;
FlowLayout flowLayout;
List<String[]> myEntries;
public NewClass(){
this.studentColumnNames = new ArrayList<>();
this.studentColumnNames.add("A");
this.studentColumnNames.add("B");
this.studentColumnNames.add("C");
this.studentColumnNames.add("D");
this.studentColumnNames.add("E");
this.studentColumnNames.add("F");
this.studentColumnNames.add("G");
this.split = new JComboBox();
this.split.addItem(";");
this.split.addItem(".");
this.split.addItem("tab");
read();
populateData();
this.dataDemoTable = new JTable(new DefaultTableModel(this.rowData, studentColumnNames.toArray()));
this.dataDemoTable.setFont(new Font("Calibri", Font.PLAIN,18));
this.dataDemoTable.setPreferredScrollableViewportSize(new Dimension(490,290));
this.dataDemoTable.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(this.dataDemoTable);
container = getContentPane();
flowLayout = new FlowLayout();
container.setLayout(flowLayout);
container.add(scrollPane);
container.add(this.split);
close();
this.handle = new Handle();
this.split.addItemListener(handle);
}
private int getNumberOfColumnsFromFile(){
//Estimating number of columns from file
this.numberOfColumns = 0;
try {
this.nextLine = this.reader.readNext();
} catch (IOException ex) {
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
}
if(this.nextLine != null){
this.numberOfColumns = this.nextLine.length;
}
return this.numberOfColumns;
}
private void close(){
try {
this.fileInputStream.close();
this.fileReader.close();
this.reader.close();
}
catch (IOException ex) {
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void populateData(){
try {
myEntries = this.reader.readAll();
} catch (IOException ex) {
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
}
this.rowData = myEntries.toArray(new String[0][]);
}
private void read(){
try {
this.fileInputStream = new FileInputStream("D:\\Book2.txt"); //the txt file above
UTF8_CHARSET = StandardCharsets.UTF_8.newDecoder();
UTF8_CHARSET.onMalformedInput(CodingErrorAction.REPLACE);
this.fileReader = new InputStreamReader(this.fileInputStream, UTF8_CHARSET);
this.reader = new CSVReader(this.fileReader, this.split.getSelectedItem().toString().charAt(0));
if(getNumberOfColumnsFromFile() > studentColumnNames.size()){
int remainder = getNumberOfColumnsFromFile()-studentColumnNames.size();
for(int i = 1; i <= remainder; i++){
//add one more name to studentColumnNames
studentColumnNames.add("" + (i) + "");
}
}
}
catch (FileNotFoundException ex) {
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void setVisibilityToView(){setVisible(true);}
public void setNumberOfColumns(int numberOfColumns){this.numberOfColumns = numberOfColumns;}
public void setSizeToView(int width,int height){setSize(width, height);}
public void setDefaultCloseOperationToView(){setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
public class Handle implements ItemListener{
@Override
public void itemStateChanged(ItemEvent e) {
read();
populateData();
close();
}
}
}
Could someone please suggest a solution to that problem? 有人可以建议解决这个问题的方法吗? Thank you.
谢谢。
Have a look at the following example. 看下面的例子。 Yours what a little hard to follow, especially because I am not familiar with OpenCSV.
您的操作有些困难,尤其是因为我对OpenCSV不熟悉。
If you look at the getModelFromCsvFile
it prettey much serves the same function as your read()
method, except I return a DefaultTableModel
and use a split instead. 如果您查看
getModelFromCsvFile
那么它非常有作用与您的read()
方法相同的功能,除了我返回DefaultTableModel
并改用split。 You can use your own implementation for the method. 您可以对方法使用自己的实现。 You just need to use the delimiter to set it in open csv.
您只需要使用定界符在开放的csv中进行设置即可。 I am not sure how to set the delimiter with open csv, but I'm sure if you know the api, it's something trivial
我不确定如何使用打开的csv设置定界符,但是我确定如果您知道api,那是微不足道的
If you look at the getDelimiterComboBox
, I create the combo box with an ActionListener. 如果您查看
getDelimiterComboBox
,那么我将使用ActionListener创建组合框。 When the value in the combo box changes, I call the getModelFromCsvFile
and then set a new model for the table. 当组合框中的值更改时,我调用
getModelFromCsvFile
,然后为该表设置一个新模型。
It should be pretty easy to follow, but this is the basic idea you want to go after. 它应该很容易遵循,但这是您要遵循的基本思想。
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 javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class ReadFileDemo {
private String defaultFile = "D:\\Book.txt";
private File currentFile = new File(defaultFile);
private JTable table;
public ReadFileDemo() {
DefaultTableModel model = getModelFromCsvFile(currentFile, ";");
table = new JTable(model);
JFrame frame = new JFrame();
frame.add(new JScrollPane(table));
frame.add(getDelimiterComboBox(new String[] {";", ".", "\t"}), BorderLayout.NORTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
/**
* Similar to your read() method
*/
public DefaultTableModel getModelFromCsvFile(File file, String delimiter) {
DefaultTableModel model = null;
String line;
boolean isFirstLine = true;
try(BufferedReader reader = new BufferedReader(new FileReader(file))) {
while ((line = reader.readLine()) != null) {
String[] row = line.split(delimiter);
if (isFirstLine) {
Object[] header = getTableColumnHeaders(row.length);
model = new DefaultTableModel(header, 0);
model.addRow(row);
isFirstLine = false;
} else {
if (model != null) {
model.addRow(row);
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return model;
}
public JComboBox getDelimiterComboBox(String[] delimiters) {
final JComboBox cbox = new JComboBox(delimiters);
cbox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String delimiter = cbox.getSelectedItem().toString();
DefaultTableModel model = getModelFromCsvFile(currentFile,
delimiter);
table.setModel(model);
}
});
return cbox;
}
public Object[] getTableColumnHeaders(int size) {
Object[] header = new Object[size];
for (int i = 0; i < header.length; i++) {
header[i] = i + 1;
}
return header;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new ReadFileDemo();
}
});
}
}
UPDATE UPDATE
Using CSVReader
in the read()
method. 在
read()
方法中使用CSVReader
。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
import java.nio.charset.StandardCharsets;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import au.com.bytecode.opencsv.CSVReader;
public class ReadFileDemo {
private String defaultFile = "D:\\Book.txt";
private File currentFile = new File(defaultFile);
private JTable table;
private CSVReader reader;
private CharsetDecoder UTF8_CHARSET;
public ReadFileDemo() {
DefaultTableModel model = getModelFromCsvFile(currentFile, ";");
table = new JTable(model);
JFrame frame = new JFrame();
frame.add(new JScrollPane(table));
frame.add(getDelimiterComboBox(new String[] { ";", ".", "\t" }),
BorderLayout.NORTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
/**
* Similar to your read() method
*/
public DefaultTableModel getModelFromCsvFile(File file, String delimiter) {
DefaultTableModel model = null;
boolean isFirstRow = true;
try {
UTF8_CHARSET = StandardCharsets.UTF_8.newDecoder();
UTF8_CHARSET.onMalformedInput(CodingErrorAction.REPLACE);
reader = new CSVReader(new InputStreamReader(new FileInputStream(file),
UTF8_CHARSET), delimiter.charAt(0));
List<String[]> dataList = reader.readAll();
for (String[] row: dataList) {
if (isFirstRow) {
model = new DefaultTableModel(getTableColumnHeaders(row.length), 0);
model.addRow(row);
isFirstRow = false;
}
else {
if (model != null) {
model.addRow(row);
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return model;
}
public JComboBox getDelimiterComboBox(String[] delimiters) {
final JComboBox cbox = new JComboBox(delimiters);
cbox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String delimiter = cbox.getSelectedItem().toString();
DefaultTableModel model = getModelFromCsvFile(currentFile,
delimiter);
if (model != null) {
table.setModel(model);
}
}
});
return cbox;
}
public Object[] getTableColumnHeaders(int size) {
Object[] header = new Object[size];
for (int i = 0; i < header.length; i++) {
header[i] = i + 1;
}
return header;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ReadFileDemo();
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.