2012-07-20 9 views
5

Jetzt habe ich eine Suche textField mit KeyReleased -Ereignis implementiert, die jTable nicht gefunden/aktualisiert, wenn ich z. B. "An" von "Andrew" eingeben, und direkt nachdem ich genau zu tippen (caseSensitive) der Name, den ich finden möchte.Implementiere Suche textField in jTabelle

Also, was ich will, ist die Filtermethode von diesem site zu implementieren, aber ich habe große Probleme. Nach unten Implementierung und Entfernen der "alten" KeyReleased-Ereignis, wenn ich etwas in Textfeld "txt_search" eingeben geschieht nichts mit jTable.

der Tabelle Mein Code von IDE (NetBeans) erzeugt wird (von fertigem Code Platte kopiert):

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

und fügte ich diese auf meiner Fensterklasse, wo Tisch ist:

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

I brauche wirklich Hilfe, bitte! Dies ist meine letzte Chance, weil ich wirklich die Google-Suchlösungen gemacht habe, und nichts hat sich geändert.

Bei allem Respekt, Andrew

Antwort

5
  • wenig des LKW Code aus JTable Tutorial zum Filtern und

  • zum Filtern für JCheckBox sortieren Sie können "true"/"false"

zu setzen

code

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

Nur als ein zusätzlicher Zeiger auf den wahrscheinlichsten der wichtigste Unterschied: 'table.setRowSorter (sorter);', da der Code in der Frage diesen Teil vergessen hat. – Yhn

+0

Ich kenne dieses Beispiel, aber Sie können mir helfen, mich an meine Bedürfnisse anzupassen. Zur Zeit verwende ich IDE, um jTable, textFields und so zu konstruieren. In naher Zukunft plane ich, manuell zu konstruieren. Ich bin verwirrt, wenn ich versuche, diesen Code an meinen jTable-generierten Code mit Standardmodell und so zu ändern. –

+0

@Apopei Andrei Ionut Tut mir leid, ich weiß nicht, wie es von built_in pallete zu tun ist, es gibt Eigenschaftsfelder für jede Aktion, kein Grund auf meiner Seite, warum Java & Swing und mit GUI Editor auch, – mKorbel