我有一个mydata.txt文件,其中包含:
Сухачёв Денис Владимирович, ИИТиУТС, 1, 11
Жмышенко Валерий Альбертович, ИЯЭиП, 3, 31
Ларин Дмитрий Александрович, ИРИБ, 2, 14
我需要打开这个文本文件并将信息放在一个jtable中,这样我就可以添加、删除或更新信息。有能力排序和保存文件
jtable应具有以下列: Name, University, Quarter, Number of days.
我被告知我需要逐行阅读文本,将其放入arraylist中,然后为jtable中的每个“,”<拆分行
我使用我的类读取或写入文件:
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class NIO {
public static List<String> inpLines(String paths) throws IOException { //read file
Charset charset = StandardCharsets.UTF_8;
// Задаем кодировку файла
List<String> lines = new ArrayList<String>(); // Создаем колекцию Строк
Path path = Paths.get(paths); // получаем путь к файлу
try {
lines = Files.readAllLines(path, charset); // читаем строки
} catch (IOException e) {
System.out.println(e);
}
return lines;
}
public static List<Result> StringsToResults(List<String> lines) { //Split lines
List<Result> results = new ArrayList<Result>();
for (int i = 0; i < lines.size(); i++) {
String[] words = lines.get(i).split(",");
Result r = new Result();
r.setTeacherId(words[0].trim());
r.setCodeUniversity(words[1].trim());
try {
r.setNumQuarter(Integer.parseInt(words[2].trim()));
r.setAmountDays(Integer.parseInt(words[3].trim()));
} catch (NumberFormatException e) {
return null;
}
results.add(r);
}
return results;
}
public static boolean outpLines (String fileName, List <String> lines )
throws IOException { //writing to file
PrintWriter out = null;
if ((lines==null)|| lines.isEmpty()) return false;
try {
out=new PrintWriter(new FileWriter(fileName));
int n=lines.size();
for (int i=0; i<n; i++){
out.println(lines.get(i).trim());
}
}
catch (IOException e){
return false;}
finally {
if (out != null) out.close();
}
return true;
}
public static List <String> ResultsToString (List <Result> results) { //Formatting for writing to a file
if (results==null || results.isEmpty ()) return null;
List <String> lines = new ArrayList <String> ();
for (Result res: results)
lines.add(String.format("%10s, %10s, %5d, %5d", res.getTeacherId(),
res.getCodeUniversity(), res.getNumQuarter(),res.getAmountDays()));
return lines;
}
}
为了显示表格数据,我实现了resulttablemodel
import javax.swing.table.AbstractTableModel;
import java.util.List;
public class ResultTableModel extends AbstractTableModel {
private static final int COLUMN_ID = 0;
private static final int COLUMN_CODE = 1;
private static final int COLUMN_NUM = 2;
private static final int COLUMN_AMOUNT = 3;
private String[] columnNames = {"Номер Преподавателя", "Шифр Вуза", "Номер Квартала", "Количество Дней"};
List<Result> results;
public ResultTableModel(List<Result> results) {
this.results = results;
}
@Override
public int getColumnCount() {
return columnNames.length;
} // +
@Override
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
} // +
@Override
public int getRowCount() {
return results.size();
} // +
public Class getColumnClass( int columnIndex) {
if (results.isEmpty()) {
return Object.class;
}
return getValueAt(0, columnIndex).getClass();
}
public Object getValueAt(int rowIndex, int columnIndex) {
Result result = getResult(rowIndex); // мб изменить Result result = get(row);
Object returnValue = null;
switch (columnIndex) {
case COLUMN_ID:
returnValue = result.getTeacherId();
break;
case COLUMN_CODE:
returnValue = result.getCodeUniversity();
break;
case COLUMN_NUM:
returnValue = result.getNumQuarter();
break;
case COLUMN_AMOUNT:
returnValue = result.getAmountDays();
break;
default:
throw new IllegalArgumentException("Invalid column index");
}
return returnValue;
}
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex)
{
Result result = getResult(rowIndex);
switch (columnIndex) {
case COLUMN_ID:
result.setTeacherId((String) value);
break;
case COLUMN_CODE:
result.setCodeUniversity((String) value);
break;
case COLUMN_NUM:
result.setNumQuarter((Integer) value);
break;
case COLUMN_AMOUNT:
result.setAmountDays((Integer) value);
break;
}
fireTableCellUpdated(rowIndex, columnIndex);
}
public Result getResult(int rowIndex)
{
return results.get(rowIndex);
}
}
以及使用对象结果
import java.util.ArrayList;
import java.util.List;
public class Result {
private String teacherId; // Айди Преподователя
private String codeUniversity; // Шифр Вуза
private int numQuarter; // Номер Квартала
private int amountDays; // Количество Дней
public Result() {
teacherId = "";
codeUniversity = "";
numQuarter = 0;
amountDays = 0;
}
public Result(String teacherId, String codeUniversity, int numQuarter, int amountDays){
this.teacherId = teacherId;
this.codeUniversity = codeUniversity;
this.numQuarter = numQuarter;
this.amountDays = amountDays;
}
public String getTeacherId() { return teacherId; }
public String getCodeUniversity() { return codeUniversity; }
public int getNumQuarter() { return numQuarter; }
public int getAmountDays() { return amountDays; }
public void setTeacherId(String teacherId) { this.teacherId = teacherId; }
public void setCodeUniversity(String codeUniversity) { this.codeUniversity = codeUniversity; }
public void setNumQuarter(int numQuarter) { this.numQuarter = numQuarter; }
public void setAmountDays(int amountDays) { this.amountDays = amountDays; }
}
我使用全局类来访问函数,尽管我在这里由于缺乏知识而尽可能地愚蠢
import java.util.*;
public class Global {
public static ResultGroup table;
public static List <Result> results;
static ResultTableModel tableModel;
public static void updateJTable(List <Result> res){
results.clear();
results.addAll(res);
tableModel.fireTableDataChanged();
}
}
我用这个类来处理表格数据
import java.util.*;
public class ResultGroup {
public List <Result> results;
public ResultGroup() {
results = new ArrayList <Result>();
}
public ResultGroup(List list){
results = new ArrayList <Result>(list);
}
public List <Result> getResults(){
return results;
}
public boolean addResult(Result res){
if (getResult(res)!=null)
return false;
if (results.add(res)) return true;
else return false;
}
public boolean delResult(Result res){
if (getResult(res)!=null)
return false;
if (results.remove(res)) return true;
else return false;
}
public boolean updateResult(Result res){
Result r = getResult(res);
if (r!=null) {r.setAmountDays(res.getAmountDays()); return true;}
return false;
}
public Result getResult (Result res){
for (Result r : results)
if (r.equals(res)) return r;
return null;
}
}
我在应用程序中都用到了
import java.awt.*;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.util.*;
import java.util.List;
import java.util.regex.PatternSyntaxException;
public class MDIApplication extends javax.swing.JFrame implements ActionListener{
String directoryName ="C:/";
String fileName="";
File curFile;
java.util.List <String> LINES;
private javax.swing.JLabel currentOpenFile;
private javax.swing.JTextField filterCode;
private javax.swing.JTable jTable1;
private javax.swing.JLabel numUniversity;
private javax.swing.JLabel sMessages;
JTextField idTeacherTextField;
JTextField codeUTextField;
JTextField numQTextField;
JTextField amountDTextField;
public MDIApplication() {
initComponents();
}
private void initComponents() {
Global.table = new ResultGroup();
Global.results = new ArrayList<>();
Global.tableModel = new ResultTableModel(Global.results);
TableRowSorter<TableModel> sorter;
jTable1 = new javax.swing.JTable(Global.tableModel);
filterCode = new javax.swing.JTextField();
currentOpenFile = new javax.swing.JLabel();
JLabel headerTable = new JLabel();
JScrollPane jScrollPane1 = new JScrollPane();
JLabel editTable = new JLabel();
JLabel idTeacherLabel = new JLabel();
JLabel codeULabel = new JLabel();
JLabel numQLabel = new JLabel();
JLabel amountDLabel = new JLabel();
idTeacherTextField = new JTextField();
codeUTextField = new JTextField();
numQTextField = new JTextField();
amountDTextField = new JTextField();
JButton addButton = new JButton();
JButton updateButton = new JButton();
JButton delButton = new JButton();
JButton clearButton = new JButton();
sMessages = new javax.swing.JLabel();
JLabel numViewULabel = new JLabel();
numUniversity = new javax.swing.JLabel();
JButton viewButton = new JButton();
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu();
JMenuItem openMenuItem = new JMenuItem();
JMenuItem saveMenuItem = new JMenuItem();
JMenuItem saveAsMenuItem = new JMenuItem();
JMenuItem exitMenuItem = new JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
TableRowSorter<DefaultTableModel> trs = new TableRowSorter(jTable1.getModel());
jTable1.setRowSorter(trs);
List<RowSorter.SortKey> sortKeys = new ArrayList<>();
sortKeys.add(new RowSorter.SortKey(3, SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(1, SortOrder.DESCENDING));
trs.setSortKeys(sortKeys);
trs.sort();
jTable1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jTable1.setFocusable(false);
jTable1.setGridColor(new java.awt.Color(236, 236, 236));
jTable1.setSelectionBackground(new java.awt.Color(213, 227, 239));
jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jTable1.setShowGrid(true);
jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
int setSelectedRow = jTable1.rowAtPoint(evt.getPoint());
idTeacherTextField.setText(Global.tableModel.getValueAt(trs.convertRowIndexToModel(setSelectedRow), 0).toString());
codeUTextField.setText(Global.tableModel.getValueAt(trs.convertRowIndexToModel(setSelectedRow), 1).toString());
numQTextField.setText(Global.tableModel.getValueAt(trs.convertRowIndexToModel(setSelectedRow), 2).toString());
amountDTextField.setText(Global.tableModel.getValueAt(trs.convertRowIndexToModel(setSelectedRow), 3).toString());
}
});
jScrollPane1.setViewportView(jTable1);
addButton.setText("Добавить");
addButton.addActionListener(this::addButtonActionPerformed);
updateButton.setText("Обновить");
updateButton.addActionListener(this::updateButtonActionPerformed);
delButton.setText("Удалить");
delButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
int n,n2;
String str1, str2, str3 ,str4;
str1=idTeacherTextField.getText(); str2=codeUTextField.getText(); str3=numQTextField.getText(); str4=amountDTextField.getText();
if (str1.equals("")||str2.equals("")||str3.equals("")||str4.equals("")){
sMessages.setText("Задайте значения полей");
return;}
n=Integer.parseInt(str3);
n2=Integer.parseInt(str4);
sMessages.setText(
" Запрос на удаление записи по ключу");
Global.table.delResult(new Result(str1,str2,n,n2));
Global.updateJTable(Global.table.getResults());
idTeacherTextField.setText(""); codeUTextField.setText(""); numQTextField.setText(""); amountDTextField.setText("");
}
});
clearButton.setText("Очистить");
clearButton.addActionListener(this::clearButtonActionPerformed);
/*
using Location Manager to display GROUPLAYOUT
*/
}
public void OpenFile(){
JFileChooser chooser= new JFileChooser(directoryName);
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Текстовые Документы", "txt");
chooser.setFileFilter(filter);
chooser.setDialogTitle("Открыть...");
int returnVal = chooser.showOpenDialog(this);
if (returnVal== JFileChooser.APPROVE_OPTION){
curFile=chooser.getSelectedFile();
fileName=curFile.getAbsolutePath();
int n =fileName.lastIndexOf('\\');
directoryName=fileName.substring(0,n+1);
try{
LINES = NIO.inpLines(fileName);
if (LINES!=null) sMessages.setText("Успешное открытие файла!");
else sMessages.setText("Ошибка открытия файла!");
}catch (Exception e) {sMessages.setText("Ошибка открытия файла!");}
java.util.List <Result> res = NIO.StringsToResults(LINES);
Global.table.getResults().clear();
assert res != null;
for (Result r: res) Global.table.addResult(r);
Global.updateJTable(Global.table.getResults());
}
}
private void SaveDialog(){
JFileChooser chooser= new JFileChooser(directoryName);
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Текстовые Документы", "txt");
chooser.setFileFilter(filter);
chooser.setDialogTitle("Сохранить...");
int returnVal = chooser.showOpenDialog(this);
if (returnVal== JFileChooser.APPROVE_OPTION){
curFile=chooser.getSelectedFile();
fileName=curFile.getAbsolutePath();
int n = fileName.lastIndexOf('\\');
directoryName=fileName.substring(0,n+1);
}
}
public void SaveFile(boolean fs){
String old_file_name=fileName;
sMessages.setText(" Сохранение файла");
if (fs) SaveDialog();
else if (fileName.equals("")) SaveDialog();
if (curFile==null){sMessages.setText(
" Файл для сохранения не выбран"); return;}
if ((!curFile.exists())|| fileName.equals(old_file_name)){
LINES = NIO.ResultsToString(Global.table.getResults());
try{
boolean f=NIO.outpLines(fileName, LINES);
if (f) {sMessages.setText(" Данные успешно сохранены"); currentOpenFile.setText(fileName);}
else sMessages.setText(" Ошибка сохранения данных");}
catch (Exception e) { sMessages.setText(" Ошибка сохранения данных");}
}
}
private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {
int n,n2;
String str1, str2, str3 ,str4;
str1=idTeacherTextField.getText(); str2=codeUTextField.getText(); str3=numQTextField.getText(); str4=amountDTextField.getText();
if (str1.equals("")||str2.equals("")||str3.equals("")||str4.equals("")){
sMessages.setText("Задайте значения полей");
return;}
try{//Контролируем исключения при преобразовании из String в число
n=Integer.parseInt(str3);
}//try
catch (NumberFormatException e){// обработчик исключения для try
sMessages.setText(" Задайте правильно число голов");
return;}
try{//Контролируем исключения при преобразовании из String в число
n2=Integer.parseInt(str4);
}//try
catch (NumberFormatException e){// обработчик исключения для try
sMessages.setText(" Задайте правильно число голов");
return;}
sMessages.setText(
" Запрос на добавление записи в таблицу");
if (!Global.table.addResult(new Result(str1,str2,n,n2)))
sMessages.setText(
" Запись не добавлена, возможно нарушена уникальность ключа");
Global.updateJTable(Global.table.getResults());
idTeacherTextField.setText(""); codeUTextField.setText(""); numQTextField.setText(""); amountDTextField.setText("");
}
private void updateButtonActionPerformed(java.awt.event.ActionEvent evt) {
int n,n2;
String str1, str2, str3 ,str4;
str1=idTeacherTextField.getText(); str2=codeUTextField.getText(); str3=numQTextField.getText(); str4=amountDTextField.getText();
if (str1.equals("")||str2.equals("")||str3.equals("")||str4.equals("")){
sMessages.setText("Задайте значения полей");
return;}
try{//Контролируем исключения при преобразовании из String в число
n=Integer.parseInt(str3);
}//try
catch (NumberFormatException e){// обработчик исключения для try
sMessages.setText(" Задайте правильно число голов");
return;}
try{//Контролируем исключения при преобразовании из String в число
n2=Integer.parseInt(str4);
}//try
catch (NumberFormatException e){// обработчик исключения для try
sMessages.setText(" Задайте правильно число голов");
return;}
sMessages.setText(
" Запрос на обновление записи в таблице");
if (!Global.table.updateResult(new Result(str1,str2,n,n2)))
sMessages.setText(
" Запись не обновлена, возможно записи с таким ключом нет");
Global.updateJTable(Global.table.getResults());
idTeacherTextField.setText(""); codeUTextField.setText(""); numQTextField.setText(""); amountDTextField.setText("");
}
private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {
idTeacherTextField.setText(""); codeUTextField.setText(""); numQTextField.setText(""); amountDTextField.setText("");
}
public static void main(String[] args) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | UnsupportedLookAndFeelException | IllegalAccessException | InstantiationException ex) {
java.util.logging.Logger.getLogger(MDIApplication.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(() -> new MDIApplication().setVisible(true));
}
}
我试图缩短代码,但还是请原谅我
暂无答案!
目前还没有任何答案,快来回答吧!