JTable - 添加,编辑,删除行

时间:2015-05-19 15:54:10

标签: java swing file-io jtable abstracttablemodel

请帮助我,如果我想添加新行,编辑行并从表中删除行,我该怎么办?我试图做一些事情,但它不起作用。 (该表打开csv文件,其中列由;分隔,例如,行如下所示:

  

麦克;泰森; 50; mike@tyson.com; 123123123

这是我的代码:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;

public class T1Data extends JPanel {
    private final JTable table;
    private MyModel model;
    private JPanel buttonsPanel;
    static File currentFile;    //remember edited file

    public T1Data() {
        super(new BorderLayout(3, 3));

        model = new MyModel();
        table = new JTable(model);
        table.setModel(model);
        this.table.setPreferredScrollableViewportSize(new Dimension(700, 70));
        this.table.setFillsViewportHeight(true);

        JPanel ButtonOpen = new JPanel(new FlowLayout(FlowLayout.CENTER));
        add(ButtonOpen, BorderLayout.SOUTH);
        // Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);
        // Add the scroll pane to this panel.
        add(scrollPane, BorderLayout.CENTER);

        //Create button panel
        buttonsPanel = new JPanel();
        buttonsPanel.setLayout(new FlowLayout(5, 50, 5));

        //add 'Open button
        JButton open = new JButton("Open...");
        buttonsPanel.add(open);
        //add 'Add' button
        JButton add = new JButton("Add row");
        buttonsPanel.add(add);
        //add 'Remove' button
        JButton remove = new JButton("Remove row");
        buttonsPanel.add(remove);
        //add 'Save' button
        JButton save = new JButton("Save");
        buttonsPanel.add(save);
        //add 'Save as...' button
        JButton saveAs = new JButton("Save As...");
        buttonsPanel.add(saveAs);

        //add buttonPanel to Frame
        add(buttonsPanel, BorderLayout.SOUTH);

        // add a nice border
        setBorder(new EmptyBorder(10, 10, 10, 10));

        //'Open' button action
        open.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                JFileChooser fileopen = new JFileChooser();
                FileFilter filter = new FileNameExtensionFilter(
                        "Text/CSV file", "txt", "csv");
                fileopen.addChoosableFileFilter(filter);

                int ret = fileopen.showDialog(null, "Choose file");

                if (ret == JFileChooser.APPROVE_OPTION) {

                    // Read Text file
                    File file = fileopen.getSelectedFile();
                    T1Data.currentFile = file;
                    CSVFile Rd = new CSVFile();
                    MyModel NewModel = new MyModel();
                    table.setModel(NewModel);
                    ArrayList<String[]> Rs2 = Rd.ReadCSVfile(file);
                    NewModel.AddCSVData(Rs2);
                    System.out.println("Rows: " + NewModel.getRowCount());
                    System.out.println("Cols: " + NewModel.getColumnCount());
                }
            }
        });
        //'Add row' button action
        /*
        add.addActionListener(new ActionListener(){
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    int row = table.getSelectedRow();
                    if (row!=-1) model.deleteRow(row);
                }
            }
       });
       */
        //'Remove row' button action
        remove.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    int row = table.getSelectedRow();
                    if (row!=-1) model.deleteRow(row);
                }
            });

        //'Save' button action
        save.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e){
                try{
                   //the file path
                   File file = currentFile;
                   //if the file not exist create one
                   if(!file.exists()){
                        file.createNewFile();
                   }

                   FileWriter fw = new FileWriter(file.getAbsoluteFile());
                   BufferedWriter bw = new BufferedWriter(fw);

                   //loop for jtable rows
                   for(int i = 0; i < table.getRowCount(); i++){
                   //loop for jtable column
                       for(int j = 0; j < table.getColumnCount(); j++){
                             bw.write(table.getModel().getValueAt(i, j)+";");
                       }
                    //break line at the begin 
                    //break line at the end 
                    bw.write("\r\n");
                    }
                    //close BufferedWriter
                    bw.close();
                    //close FileWriter 
                    fw.close();
                    JOptionPane.showMessageDialog(null, "Dane zostały zapisane.");

                    }catch(Exception ex){
                       ex.printStackTrace();
                    }
                }
        });


        //'Save As...' button action
        saveAs.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e){
                try{

                    JFileChooser chooser = new JFileChooser(".");
                    int status = chooser.showSaveDialog(T1Data.this);
                    if (status == JFileChooser.APPROVE_OPTION) {

                        //the file path
                        File file = chooser.getSelectedFile();
                        //if the file not exist create one
                        if(!file.exists()){
                            file.createNewFile();
                        }

                        FileWriter fw = new FileWriter(file.getAbsoluteFile());
                        BufferedWriter bw = new BufferedWriter(fw);

                        //loop for jtable rows
                        for(int i = 0; i < table.getRowCount(); i++){
                            //loop for jtable column
                            for(int j = 0; j < table.getColumnCount(); j++){
                                bw.write(table.getModel().getValueAt(i, j)+";");
                            }
                            //break line at the begin 
                            //break line at the end 
                            bw.write("\r\n");
                        }
                        //close BufferedWriter
                        bw.close();
                        //close FileWriter 
                        fw.close();
                        JOptionPane.showMessageDialog(null, "File saved.");
                    }
                 }catch(Exception ex){
                     ex.printStackTrace();
                 }
            }
        });
    }

    // Method for reading CSV file
    public class CSVFile {
        private final ArrayList<String[]> Rs = new ArrayList<String[]>();
        private String[] OneRow;

        public ArrayList<String[]> ReadCSVfile(File DataFile) {
            try {
                BufferedReader brd = new BufferedReader(new FileReader(DataFile));
                while (brd.ready()) {
                    String st = brd.readLine();
                    OneRow = st.split(";"); // OneRow = st.split(",|\\s|;");
                    Rs.add(OneRow);
                    System.out.println(Arrays.toString(OneRow));
                } // end of while
            } // end of try
            catch (Exception e) {
                String errmsg = e.getMessage();
                System.out.println("File not found:" + errmsg);
            } // end of Catch
            return Rs;
        }// end of ReadFile method


    }// end of CSVFile class

    private static void createAndShowGUI() {
        // Create and set up the window.
        JFrame frame = new JFrame("T1Data");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Create and set up the content pane.
        T1Data newContentPane = new T1Data();
        frame.setContentPane(newContentPane);
        // Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    class MyModel extends AbstractTableModel {
        //public boolean isCellEditable(int row, int col) { return true; }  //CELL EDITING
        private final String[] columnNames = { "Name", "Surname", "Age", "Email", "Telephone"};
        private ArrayList<String[]> Data = new ArrayList<String[]>();

        public void AddCSVData(ArrayList<String[]> DataIn) {
            this.Data = DataIn;
            this.fireTableDataChanged();
        }

        @Override
        public int getColumnCount() {
            return columnNames.length;// length;
        }

        @Override
        public int getRowCount() {
            return Data.size();
        }

        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public Object getValueAt(int row, int col) {
            return Data.get(row)[col];
        }

        /*
         DOESN'T WORK!!!!!!!!!!!!!!!!!!!1
        // Deletes the given row
        public void deleteRow(int row) {
            if (row == -1) return;

            Data.remove(row);
            fireTableRowsDeleted(row, row);
        }
        */
    }

    public static void main(String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }


}

1 个答案:

答案 0 :(得分:2)

当您加载File JButton open中的ActionListener时,代码会创建一个新的TableModel并设置JTable模型:

MyModel NewModel = new MyModel();
table.setModel(NewModel);

NewModel实例是此方法的本地实例,因此对实例变量model的任何更改都不会反映在JTable中(换句话说,model != table.getModel()) 。而不是创建局部变量,将实例变量设置为新模型。例如:

model = new MyModel();//sets the instance variable to the new model
table.setModel(NewModel);

这样,只要代码引用model,它就会对TableModel的当前JTable起作用。或者,在对TableModel进行更改时,您可以直接从JTable获取模型,必要时进行投射:

remove.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        int row = table.getSelectedRow();
        MyModel myModel = (MyModel)table.getModel();//get the model directly
        if (row!=-1) myModel .deleteRow(row);
    }
});