2012-07-20 127 views
5

現在我有一個使用KeyReleased事件實現的搜索文本字段,當我開始從「Andrew」開始鍵入例如「An」時,找不到/更新jTable,並且在完成鍵入之後( caseSensitive)我想找的名字。實現搜索textField到jTable

所以,我想要的是從這個site實施過濾方法,但我有很大的問題。在下面的實現並刪除「舊」KeyReleased事件後,當我在文本字段「txt_search」中輸入某些內容時,jTable沒有任何反應。

我由IDE(NetBeans的)生成的表的代碼(從自定義代碼面板複製):

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); 

和添加此在我的面板類,其中表是:

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); 
} 

我真的需要一些幫助,請!這是我的最後一次機會,因爲我真的做了谷歌搜索解決方案,沒有任何改變。

恕我直言, 安德魯

從JTable中教程的過濾

回答

5
  • 小modiefied代碼和濾波JCheckBox的,你可以把 「真」/ 「假」

排序

  • 代碼

    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

    就像一個額外的指針,最有可能的最重要的區別:'table.setRowSorter(sorter);',因爲問題中的代碼忘記了那部分。 – Yhn 2012-07-20 11:49:38

    +0

    我知道這個例子,但你可以幫助我適應我的需求。現在我用IDE來構建jTable,textFields和東西。在不久的將來,我計劃手動構建。我很困惑,當我嘗試使用默認模型和東西將代碼適配到我的jTable生成的代碼時。 – 2012-07-20 12:01:24

    +0

    @Apopei Andrei Ionut抱歉,我不知道如何從built_in pallete那裏做到這一點,每個動作都有屬性字段,沒有理由在我身邊爲什麼要知道Java&Swing和GUI編輯器, – mKorbel 2012-07-20 12:54:13