2013-01-08 100 views
1

我有一個表,顯示正確的txt文件的所有書籍列表。 我添加了一個新的按鈕來獲取id號碼的文本框,如果找到,刪除它從文件記錄,但如果我想從表中刪除太,我要重新顯示錶框。 我想,當一個記錄從文件中刪除,我的表自動刷新自己,並不需要重新顯示錶框。 我的代碼是這樣的:Jtable刷新時刪除一行

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 

public class ReadBookFileToListM { 

public ReadBookFileToListM(){ 
    final ReadBookFileToList rbftl=new ReadBookFileToList(); 
    final JFrame Bframe=new JFrame("All Book List"); 
    final JTextField tf1=new JTextField("    "); 
    final JLabel foundlable=new JLabel(); 
    JButton button1=new JButton("Back To Main Page"); 
    JButton button2=new JButton("Exit"); 
    JButton button3=new JButton("Delete Book"); 
    button1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Bframe.setVisible(false); 
      new MainFrame().setVisible(true); 
     } 
    }); 
    button2.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 
      System.exit(0); 
     } 
    }); 


    JTable Btable=new JTable(rbftl); 

    button3.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 
      boolean find=false; 
    String Bookid=tf1.getText(); 
    File Mf=new File("D:\\AllBookRecords.txt"); 
    File Tf=new File("D:\\Boutput.txt"); 
    try{ 
     FileReader Bfr=new FileReader(Mf); 
     BufferedReader Bbr=new BufferedReader(Bfr); 
     PrintWriter Bpw=new PrintWriter(new FileWriter(Tf)); 
     String Bs; 
     while((Bs=Bbr.readLine()) != null){ 
       String[] Ust=Bs.split(" "); 
       String Bname=Ust[0]; 
       String Bdate=Ust[1]; 
       String id=Ust[2]; 
      if(id.equals(Bookid.trim())){ 
       find=true; 
       foundlable.setText("Book Found, "+ Bname + " " + Bdate); 
      } 
      if(!id.equals(Bookid.trim())){ 
       Bpw.println(Bs); 
      } 
     } 
     Bpw.close(); 
     Bbr.close(); 
     Mf.delete(); 
     Tf.renameTo(Mf); 

    } catch(FileNotFoundException fnfe){ 
     foundlable.setText("File Not Found"); 
    } catch(IOException ioe){ 
     foundlable.setText("IO Error"); 
     ioe.printStackTrace(); 
    } 
    finally{ 
     rbftl.fireTableDataChanged(); 
     if(find) 
     foundlable.setText("Book Deleted"); 
     else 
      foundlable.setText("Book Not Found!"); 
      tf1.setText("  "); 
    } 
     } 
    }); 

    JPanel panel=new JPanel(); 
    JScrollPane sp=new JScrollPane(Btable); 
    button1.setToolTipText("To Go Main Page, Click here"); 
    button2.setToolTipText("Terminate Program"); 
    panel.add(sp); 
    panel.add(button1); 
    panel.add(button2); 
    panel.add(button3); 
    panel.add(tf1); 
    panel.add(foundlable); 
    Bframe.add(panel); 
    Btable.setAutoCreateRowSorter(true); 
    Bframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Bframe.setBounds(300, 60, 550, 550); 
    Bframe.setVisible(true); 
} 

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

謝謝。

回答

5

信息addNotify()方法JTable的對象可能是有用的,因爲它重新配置封閉滾動窗格。

刪除表格中的行後,只需添加tableName.addNotify()

+0

我不明白它是什麼意思「重新配置封閉滾動窗格「? – Aymenworks

3

考慮到你能夠確定哪些行要被刪除,你可以使用下面,

AbstractTableModel#fireTableRowsDeleted

,然後,如果需要的話,問題重繪請求。

+1

@ Sajjad-himorning,我解釋了。我不會爲你編碼這個.. – mre

+1

對於[示例](http://stackoverflow.com/a/13880668/230513)。 – trashgod

0

如果我正確理解你想從表中刪除一行?

如果是這樣,你應該從你的TableModel刪除該行並激活相應的表更改事件讓表知道你已經刪除的行

+0

如何,請說明... – Sajad

+1

恩,這是使用JTable的基礎。我建議你閱讀JTable上的Sun教程 - http://docs.oracle.com/javase/tutorial/uiswing/components/table.html – tddmonkey

+0

非常感謝你 – Sajad