2012-07-20 38 views
5

Bây giờ tôi có một văn bản tìm kiếmĐược thực hiện với sự kiện KeyReleased, không tìm thấy/cập nhật jTable khi tôi bắt đầu nhập ví dụ "An" từ "Andrew", và ngay sau khi tôi kết thúc nhập chính xác (caseSensitive) tên mà tôi muốn tìm.Thực hiện tìm kiếm textField vào jTable

Vì vậy, những gì tôi muốn là triển khai phương pháp lọc từ site nhưng tôi có vấn đề lớn. Sau khi thực hiện dưới đây và loại bỏ sự kiện KeyReleased cũ "", khi tôi gõ một cái gì đó trong textfield "txt_search" không có gì xảy ra với jTable.

Mã của tôi của bảng được tạo ra bởi IDE (NetBeans) là (sao chép từ bảng điều khiển đang tùy chỉnh):

Table_Employee = new javax.swing.JTable(); 

Table_Employee.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] { 
     {null, null, null, null}, 
     {null, null, null, null}, 
     {null, null, null, null}, 
     {null, null, null, null} 
    }, 
    new String [] { 
     "Title 1", "Title 2", "Title 3", "Title 4" 
    } 
) 
); 

Table_Employee.setToolTipText("Employee info table"); 

Table_Employee.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); 

Table_Employee.getTableHeader().setReorderingAllowed(false); 

Table_Employee.addMouseListener(new java.awt.event.MouseAdapter() { 
    public void mouseClicked(java.awt.event.MouseEvent evt) { 
     Table_EmployeeMouseClicked(evt); 
    } 
}); 
Table_Employee.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyPressed(java.awt.event.KeyEvent evt) { 
     Table_EmployeeKeyPressed(evt); 
    } 
}); 

jScrollPane1.setViewportView(Table_Employee); 

và tôi thêm này trên lớp panel của tôi, nơi bảng là:

import java.awt.Toolkit; 
import java.awt.event.WindowEvent; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import javax.swing.JOptionPane; 
import net.proteanit.sql.DbUtils; 
import java.awt.event.*; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.text.*; 
import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableRowSorter; 


public class Employee_info extends javax.swing.JFrame { 
Connection conn=null; 
ResultSet rs=null; 
PreparedStatement pst=null; 
private TableRowSorter<DefaultTableModel> sorter; 
    /** 
    * Creates new form Employee_info 
    */ 
    public Employee_info() { 
     initComponents(); 
     conn=javaconnect.ConnecrDb(); 
     Update_table(); 
     Fillcombo(); 
     currentDate(); 
     Table_Employee.setAutoCreateRowSorter(true); 
     Table_Employee.setFillsViewportHeight(true); 
     Table_Employee.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 


     DefaultTableModel model = new DefaultTableModel(); 
     sorter = new TableRowSorter<DefaultTableModel>(model); 
     Table_Employee = new JTable(model); 


     txt_search = new JTextField(); 
     //Whenever filterText changes, invoke newFilter. 
     txt_search.getDocument().addDocumentListener(
       new DocumentListener() { 
        public void changedUpdate(DocumentEvent e) { 
         newFilter(); 
        } 
        public void insertUpdate(DocumentEvent e) { 
         newFilter(); 
        } 
        public void removeUpdate(DocumentEvent e) { 
         newFilter(); 
        } 
       }); 
    } 

    private void newFilter() { 
    RowFilter<DefaultTableModel, Object> rf = null; 
    //If current expression doesn't parse, don't update. 
    try { 
     rf = RowFilter.regexFilter(txt_search.getText(), 0); 
    } catch (java.util.regex.PatternSyntaxException e) { 
     return; 
    } 
    sorter.setRowFilter(rf); 
} 

tôi thực sự cần một số trợ giúp, xin vui lòng! Đây là cơ hội cuối cùng của tôi, bởi vì tôi thực sự đã thực hiện các giải pháp tìm kiếm của Google và không có gì thay đổi.

sự tôn trọng, Andrew

Trả lời

5
  • ít mã modiefied từ JTable hướng dẫn về lọc và sắp xếp

  • để lọc cho JCheckBox bạn có thể để đưa "true"/"false"

import java.awt.*; 
import java.util.regex.PatternSyntaxException; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 

public class TableFilterSorter extends JPanel { 

    private boolean DEBUG = false; 
    private static final long serialVersionUID = 1L; 

    public TableFilterSorter() { 
     super(new BorderLayout(5, 5)); 
     final JTextField filterCpText = new JTextField(); 
     filterCpText.setFont(new Font("Serif", Font.BOLD, 28)); 
     filterCpText.setForeground(Color.BLUE); 
     filterCpText.setBackground(Color.LIGHT_GRAY); 
     JPanel filterCpPanel = new JPanel(); 
     filterCpPanel.setLayout(new BorderLayout(5, 5)); 
     filterCpPanel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); 
     filterCpPanel.setBackground(Color.LIGHT_GRAY); 
     filterCpPanel.setPreferredSize(new Dimension(300, 30)); 
     filterCpPanel.add(filterCpText, BorderLayout.CENTER); 
     add(filterCpPanel, BorderLayout.NORTH); 
     final JTable table = new JTable(new MyTableModel()); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 160)); 
     table.setFillsViewportHeight(true); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane, BorderLayout.CENTER); 
     TableModel myTableModel = table.getModel(); 
     final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(myTableModel); 
     table.setRowSorter(sorter); 
     filterCpText.getDocument().addDocumentListener(new DocumentListener() { 

      private void searchFieldChangedUpdate(DocumentEvent evt) { 
       String text = filterCpText.getText(); 
       if (text.length() == 0) { 
        sorter.setRowFilter(null); 
        table.clearSelection(); 
       } else { 
        try { 
         sorter.setRowFilter(RowFilter.regexFilter("(?i)" + text, 4)); 
         table.clearSelection(); 
        } catch (PatternSyntaxException pse) { 
         JOptionPane.showMessageDialog(null, "Bad regex pattern", 
           "Bad regex pattern", JOptionPane.ERROR_MESSAGE); 
        } 
       } 
      } 

      @Override 
      public void insertUpdate(DocumentEvent evt) { 
       searchFieldChangedUpdate(evt); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent evt) { 
       searchFieldChangedUpdate(evt); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent evt) { 
       searchFieldChangedUpdate(evt); 
      } 
     }); 
    } 

    private class MyTableModel extends AbstractTableModel { 

     private static final long serialVersionUID = 1L; 
     private String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; 
     private Object[][] data = { 
      {"Mary", "Campione", "Snowboarding", new Integer(5), false}, 
      {"Alison", "Huml", "Rowing", new Integer(3), true}, 
      {"Kathy", "Walrath", "Knitting", new Integer(2), false}, 
      {"Sharon", "Zakhour", "Speed reading", new Integer(20), true}, 
      {"Philip", "Milne", "Pool", new Integer(10), false}, 
      {"Mary", "Campione", "Snowboarding", new Integer(5), false}, 
      {"Alison", "Huml", "Rowing", new Integer(3), true}, 
      {"Kathy", "Walrath", "Knitting", new Integer(2), false}, 
      {"Sharon", "Zakhour", "Speed reading", new Integer(20), true}, 
      {"Philip", "Milne", "Pool", new Integer(10), false},}; 

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

     @Override 
     public int getRowCount() { 
      return data.length; 
     } 

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

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

     @Override 
     public Class<?> getColumnClass(int c) { 
      return getValueAt(0, c).getClass(); 
     } 

     @Override 
     public boolean isCellEditable(int row, int col) { 
      if (col < 2) { 
       return false; 
      } else { 
       return true; 
      } 
     } 

     @Override 
     public void setValueAt(Object value, int row, int col) { 
      if (DEBUG) { 
       System.out.println("Setting value at " + row + "," + col 
         + " to " + value + " (an instance of " + value.getClass() + ")"); 
      } 
      data[row][col] = value; 
      fireTableCellUpdated(row, col); 
      if (DEBUG) { 
       System.out.println("New value of data:"); 
       printDebugData(); 
      } 
     } 

     private void printDebugData() { 
      int numRows = getRowCount(); 
      int numCols = getColumnCount(); 
      for (int i = 0; i < numRows; i++) { 
       System.out.print(" row " + i + ":"); 
       for (int j = 0; j < numCols; j++) { 
        System.out.print(" " + data[i][j]); 
       } 
       System.out.println(); 
      } 
      System.out.println("--------------------------"); 
     } 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("TableDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     TableFilterSorter newContentPane = new TableFilterSorter(); 
     newContentPane.setOpaque(true); 
     frame.setContentPane(newContentPane); 
     frame.setLocation(150, 150); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

Giống như một con trỏ bổ sung cho nhiều khả năng sự khác biệt quan trọng nhất: 'table.setRowSorter (sorter);', vì mã trong câu hỏi đã quên phần đó. – Yhn

+0

Tôi biết ví dụ này, nhưng bạn có thể giúp tôi thích ứng với nhu cầu của mình. Bây giờ tôi sử dụng IDE để xây dựng jTable, textFields và các công cụ. Trong tương lai gần, tôi có kế hoạch xây dựng bằng tay. Tôi đang bối rối khi tôi cố gắng để thích ứng với mã đó để jTable của tôi tạo ra mã với mô hình mặc định và các công cụ. –

+0

@Apopei Andrei Ionut xin lỗi tôi không biết làm thế nào để làm điều đó từ build_in pallete, có các trường thuộc tính cho mọi hành động, không có lý do nào về phía tôi tại sao phải biết Java & Swing và với GUI Editor quá, – mKorbel

Các vấn đề liên quan