2013-02-12 54 views
1

我使用這種方法改變我的表格單元格值, 它改變jtable但不改變文本文件!影響JTable單元格值改變文本文件

public class user_AllBooks extends AbstractTableModel { 

    BookInformation book_info = new BookInformation(); 
    String[] columns = new String[]{"Book Name", "Book Date", "Book ID", "Borrow Status"}; 
    ArrayList<BookInformation> bData = new ArrayList<BookInformation>(); 

    public user_AllBooks() { 
     try { 
      BufferedReader br = new BufferedReader(new FileReader("AllBookRecords.txt")); 
      String line; 
      while ((line = br.readLine()) != null) { 
       bData.add(initializeBookData(line)); 
      } 
      br.close(); 
     } catch (IOException ioe) { 
     } 
    } 

    public BookInformation initializeBookData(String myline) { 
     BookInformation book_infos = new BookInformation(); 
     String[] celledLine = myline.split("  "); 
     book_infos.setBookName(celledLine[0]); 
     book_infos.setBookDate(celledLine[1]); 
     book_infos.setBookID(celledLine[2]); 
     book_infos.setBorrowStatus(celledLine[3]); 
     return book_infos; 
    } 

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

    @Override 
    public int getRowCount() { 
     if (bData != null) { 
      return bData.size(); 
     } else { 
      return 0; 
     } 
    } 

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

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     BookInformation bookInf = bData.get(rowIndex); 
     Object value; 

     switch (columnIndex) { 
      case 0: 
       value = bookInf.getBookName(); 
       break; 
      case 1: 
       value = bookInf.getBookDate(); 
       break; 
      case 2: 
       value = bookInf.getBookID(); 
       break; 
      case 3: 
       value = bookInf.getBorrowStatus(); 
       break; 
      default: 
       value = "..."; 
     } 
     return value; 
    } 


    @Override 
    public void setValueAt(Object value, int row, int col) 
    { 
    BookInformation book_infos = bData.get(row); 
    if (col==0) 
    book_infos.setBookName((String)value); 
    else if (col==1) 
    book_infos.setBookDate((String)value); 
    else if (col==2) 
    book_infos.setBookID((String)value); 
    else if (col==3) 
    book_infos.setBorrowStatus((String)value); 
    } 
    } 

二等:

public class user_AllBooksM extends JFrame implements ActionListener { 

    user_AllBooks uAllBooks = new user_AllBooks(); 
    final JTable bTable = new JTable(uAllBooks); 
    JButton borrowButton; 

    public user_AllBooksM() { 
     setTitle("All Books"); 
     exitButton = new JButton("Exit"); 
     borrowButton = new JButton("Borrow"); 
     borrowButton.addActionListener(this); 
     JPanel Bpanel = new JPanel(); 
     Bpanel.setLayout(new FlowLayout()); 
     JScrollPane sp = new JScrollPane(bTable); 
     Bpanel.add(sp); 
     Bpanel.add(borrowButton); 
     this.add(Bpanel); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setBounds(300, 60, 550, 550); 
     this.setResizable(false); 
     this.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
     borrowInitialize(bTable.getSelectedRow()); 
    } 

    public void borrowInitialize(int row) { 
     if (uAllBooks.getValueAt(row, 3).equals("yes")) { 
      JOptionPane.showMessageDialog(null, "This Book Was Borrowed"); 
     } else { 
      uAllBooks.setValueAt("Yes", row, 3); 
      uAllBooks.fireTableRowsUpdated(row, row); 
     } 
    } 

    public static void main(String[] args) { 
     new user_AllBooksM(); 
    } 
} 

我的文本文件:

sds wew  88  77  no 
moon  889  988  yes 
ccc  30  33  no 
testing  76  77  no 
yes  999  444  no 
hoop  100  200  no 
name  60  20  no 
pp  14  15  no 
vbnet  49  94  yes 
sdsd  232  dsds  no 
gh  12  21  no 
khoyBook  322  233  no 
+2

請編輯您的問題包括[SSCCE(http://sscce.org/),其inlcudes樣本數據,排除虛假信息,並顯示你如何寫入文件;不要吞下例外。 – trashgod 2013-02-12 17:07:09

+0

@trashgod我添加文本文件... – Sajad 2013-02-12 21:03:06

+0

我添加setValueAt方法... – Sajad 2013-02-13 09:13:13

回答

2

要更改單元格值更改時的文件內容,您應該將TableModelListener註冊到關聯的TableModel。並在tableChanged方法中實現寫邏輯的文件。
以下是演示如何實施TableModelListener的示例代碼。我希望這會爲你提供一個很好的觀點,以實現自己的任務:

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JTable; 
import javax.swing.JScrollPane; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.TableModelListener; 
import javax.swing.event.TableModelEvent; 
import javax.swing.table.TableModel; 
import javax.swing.table.AbstractTableModel; 
class TableDemo extends JFrame implements TableModelListener 
{ 
    private JTable table; 
    private JScrollPane jsPane; 
    private TableModel myModel; 
    private JLabel label; 
    public void prepareAndShowGUI() 
    { 
     myModel = new MyModel(); 
     table = new JTable(myModel); 
     jsPane = new JScrollPane(table); 
     label = new JLabel(); 
     myModel.addTableModelListener(this); 
     getContentPane().add(jsPane); 
     getContentPane().add(label,BorderLayout.SOUTH); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 
    @Override 
    public void tableChanged (TableModelEvent evt) 
    { 
     int row = evt.getFirstRow(); 
     int col = evt.getColumn(); 
     label.setText("Value at ["+row+"]["+col+"] is changed to: "+myModel.getValueAt(row,col)); 
      //Write to your file here. 
    } 
    private class MyModel extends AbstractTableModel 
    { 
     String[] columns = { 
          "Roll No.", 
          "Name" 
          }; 
     String[][] inData = { 
           {"1","Anthony Hopkins"}, 
           {"2","James William"}, 
           {"3","Mc. Donald"} 
          }; 
     @Override 
     public void setValueAt(Object value, int row, int col) 
     { 
      inData[row][col] = (String)value; 
      fireTableCellUpdated(row,col); 
     } 
     @Override 
     public Object getValueAt(int row, int col) 
     { 
      return inData[row][col]; 
     } 
     @Override 
     public int getColumnCount() 
     { 
      return columns.length; 
     } 
     @Override 
     public int getRowCount() 
     { 
      return inData.length; 
     } 
     @Override 
     public String getColumnName(int col) 
     { 
      return columns[col]; 
     } 
     @Override 
     public boolean isCellEditable(int row, int col) 
     { 
      return true; 
     } 
    } 
    public static void main(String st[]) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       TableDemo td = new TableDemo(); 
       td.prepareAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

你能寫我寫入文件的方法嗎? – Sajad 2013-02-13 19:24:30

+0

應該記錄什麼文件? – Sajad 2013-02-13 19:24:56

+0

如何?....... – Sajad 2013-02-13 19:25:20

4

添加TableModelListener到您的TableModel。然後,無論何時首次更新事件,您都需要遍歷TableModel的行/列並重新創建您的文本文件。

您的TableModel執行不正確。您尚未實施setValueAt(...)方法。

應該從TableModel的setValueAt()方法調用「fireTableRowsUpdated()」方法。它不應該從您的ActionListener代碼中調用。

+0

你能解釋我更多,併爲我寫這個TableModelListener? – Sajad 2013-02-12 21:02:09

+0

@ Sajjad-HiFriend:搜索'java tutorial tablemodellistener'。 – trashgod 2013-02-12 21:37:29

+0

@ Sajjad-HiFriend你需要看看[如何使用表格](http://docs.oracle.com/javase/tutorial/uiswing/components/table.html) – MadProgrammer 2013-02-12 22:26:34