将搜索textField实现为jTable

现在我有一个用KeyReleased事件实现的搜索textField,当我开始输入例如“安德鲁”中的“An”时,我没有找到/更新jTable,就在我完成键入(caseSensitive)我想要的名字之后找。

所以,我想要的是从这个网站实现过滤方法,但我有很大的问题。 在以下实现并删除“旧”KeyReleased事件后,当我在textfield“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); 

我在我的面板类中添加了这个,其中table是:

 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 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(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 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教程的关于过滤和排序的小修改代码

  • 对于JCheckBox的过滤,你可以把“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 sorter = new TableRowSorter(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(); } }); } }