无法从jtable中删除或更新数据

ffdz8vbo  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(277)

我有一个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));
    }

}

我试图缩短代码,但还是请原谅我

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题