2013-02-17 122 views
0

我有一個JTextFiled和的JTable讀取文本文件中的數據。JTable中顯示JTextFiled搜索結果

我想一個KeyListener的添加到我的JTextFiled,當輸入一個號碼「的程序應搜索的是與我的JTable號開始我的文本文件,並顯示線。

我的文本文件:

26  thired  62  Yes 
29  sixth  92  No 
35  vff  53  No 
33  oll  36  No 
38  koole  86  No 

例如,當我寫 「3」,在文本框,我的JTable應該顯示在自己的這三條線:

35  vff  53  No 
33  oll  36  No 
38  koole  86  No 

我的代碼:

public class BookPage extends JFrame implements KeyListener{ 

private AllBooks bookModel; 
private JTable bTabel; 
JTextField tf1; 


public BookPage(){ 
    bookModel=new AllBooks(); 
    bTabel=new JTable(bookModel); 

    tf1=new JTextField(20); 
    tf1.addKeyListener(this); 

    JPanel panel= new JPanel(); 
    JScrollPane scroolpane=new JScrollPane(bTabel); 
    panel.add(tf1); 
    panel.add(scroolpane); 
    this.setContentPane(panel); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setBounds(300, 60, 800, 600); 
    this.setVisible(true); 
} 


public static void main(String[] args){ 
    new BookPage().setVisible(true); 
} 

@Override 
public void keyTyped(KeyEvent e) { 
    String line=tf1.getText().trim(); 
    SearchBook(line); 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

public void SearchBook(String Bid){ 
    File f=new File("AllBookRecords.txt"); 
    try{ 
     FileReader Bfr=new FileReader(f); 
     BufferedReader Bbr=new BufferedReader(Bfr); 
     String bs; 
     while((bs=Bbr.readLine()) != null){ 
      String[] Ust=bs.split("  "); 
      String id=Ust[0]; 
      String Bname=Ust[1]; 
      String Bdate=Ust[2]; 
      String borrowS=Ust[3]; 
      if(id.equals(Bid.trim())){ 
       bTabel.setValueAt(Bname, 10, 1); 
      } 
     } 
    } 
    catch (IOException ex) { 

    } 
} 
} 

第二級:

public class AllBooks extends AbstractTableModel{ 
BookInformation Binfos1=new BookInformation(); 

String[] Bcol=new String[]{"Id","Name","Date","Borrow Status"}; 
ArrayList<BookInformation> Bdata=new ArrayList<BookInformation>(); 

public AllBooks(){ 
    try{ 
     FileReader fr=new FileReader("AllBookRecords.txt"); 
     BufferedReader br=new BufferedReader(fr); 
     String line; 

     while((line=br.readLine()) != null){ 
      Bdata.add(initializeBookInfos(line)); 
     } 
     br.close(); 
    } 
    catch(IOException ioe){ 

    } 
} 

public static BookInformation initializeBookInfos(String myLine){ 
    BookInformation Binit=new BookInformation(); 
    String[] bookCellArray=myLine.split("  "); 
    Binit.setBookID(bookCellArray[0]); 
    Binit.setBookName(bookCellArray[1]); 
    Binit.setBookDate(bookCellArray[2]); 
    Binit.setBorrowStatus(bookCellArray[3]); 
    return Binit; 
} 
public void RemoveMyRow(int row){ 
    if(RemoveBookFromFile(row)){ 
     Bdata.remove(row); 
     fireTableRowsDeleted(row, row); 
    } 
} 

public boolean RemoveBookFromFile(int index){ 

    File Mf=new File("AllBookRecords.txt"); 
    File Tf=new File("Boutput.txt"); 
    try{ 
     BufferedReader Ubr=new BufferedReader(new FileReader(Mf)); 
     PrintWriter Bpw=new PrintWriter(new FileWriter(Tf)); 
     String line; 
     while((line=Ubr.readLine()) != null){ 
      if(line.trim().length() == 0){ 
       continue; 
      } 
      if(!line.startsWith(String.valueOf(getValueAt(index, 0)))){ 
       Bpw.println(line); 
      } 
     } 
     Bpw.close(); 
     Ubr.close(); 
     Mf.delete(); 
     Tf.renameTo(Mf); 
     return true; 
    } catch(FileNotFoundException e1){ 
     return false; 
    } 
    catch(IOException ioe){ 
      return false; 
    } 
} 

public void AddRow(BookInformation bookinfo){ 
    if(WriteBooktofile(bookinfo.toString())){ 
     Bdata.add(bookinfo); 
     fireTableRowsInserted(Bdata.size()-1, Bdata.size()-1); 
    } 
    else{ 
     JOptionPane.showMessageDialog(null, "Unable Add To File"+bookinfo.getBookName()); 
    } 
} 

public boolean WriteBooktofile(String bookc){ 
    try{ 
     File f=new File("AllBookRecords.txt"); 

      FileWriter fw=new FileWriter(f.getAbsoluteFile(), true); 
      BufferedWriter bw=new BufferedWriter(fw); 
      bw.write(bookc); 
      bw.close(); 
      return true; 
    } 
    catch(Exception e){ 
     return false; 
    } 
} 

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

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

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

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

    switch(columnIndex){ 

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

二等:

public class BookInformation { 

private String BookName; 
private String BookDate; 
private String BookID; 
private String BorrowStatus; 

public String getBookName() { 
    return BookName; 
} 

public void setBookName(String book_name) { 
    this.BookName = book_name; 
} 

public String getBookDate() { 
    return BookDate; 
} 


public void setBookDate(String book_date) { 
    this.BookDate = book_date; 
} 


public String getBookID() { 
    return BookID; 
} 

public void setBookID(String Book_id) { 
    this.BookID = Book_id; 
} 

@Override 
public String toString(){ 
    return BookID + "  " + BookName+ "  " 
      + BookDate +"  "+ BorrowStatus + "\n"; 
} 

public String getBorrowStatus() { 
    return BorrowStatus; 
} 


public void setBorrowStatus(String borrowStat) { 
    BorrowStatus = borrowStat; 
} 

} 

感謝您的幫助。

+1

請也張貼書信息類 – 2013-02-17 19:18:42

+0

@FestusTamakloe我添加BookInformation類 – Sajad 2013-02-17 19:25:24

+0

我的第一個建議是避免關鍵偵聽器並使用DocumentFilter。我的第二個建議是如果可以,將文本文件加載到內存中,或者將其存儲在內存數據庫中,這會使搜索更加簡單。在搜索用戶輸入時,還會阻止EDT。在最壞的情況下,您將不得不搜索文件的全部內容以查找每個關鍵筆劃,這可能會導致UI停止對用戶進行響應。如果可能的話,最好是以某種方式建立文件索引(假設數字未排序),以便快速查找 – MadProgrammer 2013-02-17 19:35:49

回答

2

我必須讓你的代碼NATIV一些改變,使其工作。請注意,我沒有檢查他的功能的孔代碼。

我用

@Override 
     public void keyReleased(KeyEvent e) { 
      String line = tf1.getText().trim(); 
      SearchBook(line); 
     } 

,而不是public void keyTyped(KeyEvent e) {},因爲它不發射的第一個值

你的老BookPage現在看起來

public class BookPage extends JFrame implements KeyListener { 

    private static final long serialVersionUID = 1L; 

    private AllBooks bookModel; 

    private JTable bTabel; 

    JTextField tf1; 

    public BookPage() { 
     bookModel = new AllBooks(); 
     bTabel = new JTable(bookModel); 

     tf1 = new JTextField(20); 
     tf1.addKeyListener(this); 

     JPanel panel = new JPanel(); 
     JScrollPane scroolpane = new JScrollPane(bTabel); 
     panel.add(tf1); 
     panel.add(scroolpane); 
     this.setContentPane(panel); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setBounds(300, 60, 800, 600); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new BookPage().setVisible(true); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     String line = tf1.getText().trim(); 
     SearchBook(line); 
    } 

    public void SearchBook(String bid) { 
     List<BookInformation> filtedRows = new ArrayList<BookInformation>(); 
     try { 
      InputStream stream = getClass().getResourceAsStream("AllBookRecords.txt"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
      String bs; 
      while((bs = reader.readLine()) != null) { 
       BookInformation information = new BookInformation(); 
       String[] Ust = bs.split("\\t"); 
       information.setBookID(Ust[0]); 
       information.setBookName(Ust[1]); 
       information.setBookDate(Ust[2]); 
       information.setBorrowStatus(Ust[3]); 
       if(information.getBookID().equals(bid) || information.getBookID().startsWith(bid)) { 
        filtedRows.add(information); 
       } 
      } 
      if(!filtedRows.isEmpty()) { 
         //remove old rows 
       for(int i = bookModel.getRowCount() - 1; i >= 0; i--) { 
        bookModel.RemoveMyRow(i); 
       } 
        //add new rows 
       for(BookInformation bookInformation : filtedRows) { 
        bookModel.AddRow(bookInformation); 
       } 
      } 
      bookModel.fireTableDataChanged(); 

     } catch(IOException ex) { 
      ex.getStackTrace(); 
      System.out.println(ex.getMessage()); 
     } 
    } 
} 

主要的變化在public void SearchBook(String bid) {}如果做有些不清楚隨時問我。

在你AllBooks只是一個小變化

public class AllBooks extends AbstractTableModel { 

    private static final long serialVersionUID = 1L; 

    BookInformation Binfos1 = new BookInformation(); 

    String[] bCol = new String[] { "Id", "Name", "Date", "Borrow Status" }; 

    ArrayList<BookInformation> bData = new ArrayList<BookInformation>(); 

    public AllBooks() { 
     try { 
      InputStream stream = getClass().getResourceAsStream("AllBookRecords.txt"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
      String line; 

      while((line = reader.readLine()) != null) { 
       bData.add(initializeBookInfos(line)); 
      } 
      reader.close(); 
     } catch(IOException ioe) { 

     } 
    } 

    public static BookInformation initializeBookInfos(String myLine) { 
     BookInformation Binit = new BookInformation(); 
     String[] bookCellArray = myLine.split("\\t"); 
     Binit.setBookID(bookCellArray[0]); 
     Binit.setBookName(bookCellArray[1]); 
     Binit.setBookDate(bookCellArray[2]); 
     Binit.setBorrowStatus(bookCellArray[3]); 
     return Binit; 
    } 

    public void RemoveMyRow(int row) { 
     if(RemoveBookFromFile(row)) { 
      bData.remove(row); 
      fireTableRowsDeleted(row, row); 
     } 
    } 

    public boolean RemoveBookFromFile(int index) { 

     File Mf = new File("AllBookRecords.txt"); 
     File Tf = new File("Boutput.txt"); 
     try { 
      BufferedReader Ubr = new BufferedReader(new FileReader(Mf)); 
      PrintWriter Bpw = new PrintWriter(new FileWriter(Tf)); 
      String line; 
      while((line = Ubr.readLine()) != null) { 
       if(line.trim().length() == 0) { 
        continue; 
       } 
       if(!line.startsWith(String.valueOf(getValueAt(index, 0)))) { 
        Bpw.println(line); 
       } 
      } 
      Bpw.close(); 
      Ubr.close(); 
      Mf.delete(); 
      Tf.renameTo(Mf); 
      return true; 
     } catch(FileNotFoundException e1) { 
      return false; 
     } catch(IOException ioe) { 
      return false; 
     } 
    } 

    public void AddRow(BookInformation bookinfo) { 
     if(WriteBooktofile(bookinfo.toString())) { 
      bData.add(bookinfo); 
      fireTableRowsInserted(bData.size() - 1, bData.size() - 1); 
     } else { 
      JOptionPane.showMessageDialog(null, "Unable Add To File" + bookinfo.getBookName()); 
     } 
    } 

    public boolean WriteBooktofile(String bookc) { 
     try { 
      File f = new File("AllBookRecords.txt"); 

      FileWriter fw = new FileWriter(f.getAbsoluteFile(), true); 
      BufferedWriter bw = new BufferedWriter(fw); 
      bw.write(bookc); 
      bw.close(); 
      return true; 
     } catch(Exception e) { 
      return false; 
     } 
    } 

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

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

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

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

     switch(columnIndex) { 

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

} 

現在你AllBookRecords.txt是製表符分隔(\ t)的

26 thired 62 Yes 
29 sixth 92 No 
35 vff 53 No 
33 oll 36 No 
38 koole 86 No 

有一個幾個方式來處理這個問題,但我不想在我的路上寫每一個,但嘗試使你的代碼工作變化不大

+1

謝謝發佈,這種方式很好嗎?或者可能會減慢程序? – Sajad 2013-02-18 08:24:59

+0

這種方式是好的,它不會放慢你的程序。我們只是表明我們需要什麼,否則沒有變化。 – 2013-02-18 09:25:22

5

加載所有的數據到一個JTable的。然後使用表格過濾功能僅顯示所需的行。該TableFilterDemo從Swing教程的Sorting and Filtering部分是一個工作的例子,做到這一點。

+0

使用內置的API +1 – MadProgrammer 2013-02-17 23:15:47