2015-05-19 95 views
0

请帮助我,如果我想添加一个新行,编辑行并从我的表中删除行,我该怎么办?我试图做一些事情,但它不起作用。 (在表打开,其中列由;分隔的CSV文件,例如行看起来是这样的:JTable - 添加,编辑,删除行

迈克,泰森; 50; [email protected]; 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

你能删除一些这额外的代码? – CaffeineToCode

+0

@ jaa232查看MadProgrammer关于[JTable + AbstractTableModel + ArrayList]的答案(http://stackoverflow.com/search?q=user%3A992484+ [jtable] + abstracttablemodel + arraylist +是%3Aanswer)他的引用,最活跃的AbstractTableModel VS各种数组类型 – mKorbel

回答

2

当您在Fileopen的JButton 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,它作用于JTable当前TableModel。另外,在更改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); 
    } 
}); 
+0

1.OP具有AbstractTableModel(成功使用DefaultTableModel也可以,对于OP可以更好和更好),2.两种模型(通过忽略它们的父TableModel)都具有重置的方法,两种模型都可以添加新行,删除...(这些方法在API中实现),3.不好回答 – mKorbel

+1

不管是'AbstractTableModel' *还是*'DefaultTableModel',在调用openListener的actionListener之后都有当前发布的代码,所有试图更改'model'的调用都会引用'模型“,它不是*当前的'TableModel' – copeg

+1

@mKorbel:copeg的答案确实发现调用模型变量的方法不起作用的根源 - 因为它引用了错误的TableModel对象。最好是正确设置模型字段,或者在需要模型时调用'table.getModel()'。 1+ –