Я хочу создать программу чтения файлов, которая отображает данные в JTable. Данные в файле разделены символами ',' , ';' , или же '.' персонажи. Вот небольшая часть этого
текстовый файл
12345;Βασ.ίλειος;Τζης;Περικλής;Μαρία;28/06/1984;α1
12346;Βασίλ.ειος;Τζόγλου;Πέτρος;Μαρία;29/06/1984;α1
12347;Βα.σίλειος;Τζόπουλος;Παύ.λος;Μαρία;30/06/1984;α1
12348;Βασίλ.ειος;Τζάκης;Πανα.γιώτης;Μαρία;27/06/1984;α1
Я открываю эти записи с разделителем по умолчанию (';'), как показано на рисунке ниже.
Когда я пытаюсь выбрать другой разделитель, программа должна снова прочитать файл, а затем разделить данные с новым разделителем. Я вижу, что данные не могут быть обновлены в конце концов. По настоянию я поместил весь необходимый код в один класс, чтобы его можно было запустить. Кроме того, я использую 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();
}
}
}
Может ли кто-нибудь предложить решение этой проблемы? Спасибо.
"I tried tableModel.fireTableDataChanged() but there is not such method for my JTable."
-- это метод AbstractTableModel, а не метод JTable -- пожалуйста, прочтите руководство по JTable и просмотрите API AbstractTableModel, чтобы узнать больше об этом."I have to change it to DefaultTableModel instead. But if I do so, I cannot put in into scrollPane and display it."
-- это не имеет смысла, так как модель не имеет ничего общего с помещением JTable в JScrollPane. Пожалуйста, улучшите этот вопрос. - person Hovercraft Full Of Eels   schedule 17.08.2014((DefaultTableModel)dataDemoTable.getModel()).fireTableDataChanged();
- person Joop Eggen   schedule 19.08.2014