2012-07-20 12 views
5

これでKeyReleasedイベントで実装された検索textFieldが見つかりませんでした。たとえば、 "Andrew"などの入力を開始するとjTableが更新されました。 caseSensitive)は私が探したい名前です。検索textFieldをjTableに実装

だから、私はこのsiteからFilteringメソッドを実装したいが、大きな問題がある。以下の実装と "古い" 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); 
} 

I本当に助けが必要です。これは私の最後のチャンスです。私は実際にGoogleの検索ソリューションを作ったので、何も変わりませんでした。

、 アンドリュー

答えて

5
  • フィルタリングについてJTableのチュートリアルから少し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(ソーター);'という質問のコードがその部分を忘れてしまったためです。 – Yhn

+0

私はこの例を知っていますが、私のニーズに適応するのに役立ちます。今のところ私はIDEを使ってjTable、textFields、stuffを構築しています。近い将来、私は手動で構築する予定です。私は、jTableのコードをデフォルトのモデルやもので生成したコードに適応しようとすると、混乱します。 –

+0

@ApopeiアンドレイはIonutはごめんなさいは – mKorbel