将搜索textField实现为jTable [英] Implement search textField into jTable

查看:134
本文介绍了将搜索textField实现为jTable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在我有一个用KeyReleased事件实现的搜索textField,当我开始输入例如来自Andrew的An时,我没有找到/更新jTable,并且在我完成后输入完全(caseSensitive)的名称我想找到。

Now I have a search textField implemented with KeyReleased event, which don't found/update jTable when I start typing for example "An" from "Andrew", and just after I finish to type exactly (caseSensitive) the name which I want to find.

所以,我想要的是从这个 site 但是我遇到了很大的问题。在下面的实现并删除旧的KeyReleased事件后,当我在textfieldtxt_search中输入内容时,jTable没有任何反应。

So, what I want is to implement the Filtering method from this site but I have big problems. After below implementation and removing the "old" KeyReleased event, when I type something in textfield "txt_search" nothing happens with jTable.

我的IDE生成的表代码(NetBeans )是(从自定义代码面板复制):

My code of table generated by IDE (NetBeans) is (copied from customize code panel):

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

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

and I added this on my panel class where table is:

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 really need some help, please! This is my last chance, because I really made the google search solutions, and nothing changed.

尊重,
Andrew

With respect, Andrew

推荐答案


  • 来自JTable教程的关于过滤和排序的小修改代码

    • little modiefied code from JTable tutorial about filtering and sorting

      过滤JCheckBox你可以把真/假

      for filtering for JCheckBox you can to put "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();
                  }
              });
          }
      }
      

      这篇关于将搜索textField实现为jTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆