【问题标题】:Implement search textField into jTable在 jTable 中实现搜索 textField
【发布时间】:2012-07-20 11:37:36
【问题描述】:

现在我有一个使用 KeyReleased 事件实现的搜索 textField,当我开始输入例如“Andrew”中的“An”时,它没有找到/更新 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);

我在我的面板类中添加了这个,其中 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<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);
}

我真的需要一些帮助,拜托!这是我最后一次机会,因为我真的做了google搜索解决方案,没有任何改变。

尊敬的, 安德鲁

【问题讨论】:

    标签: java swing jtable jtextfield rowfilter


    【解决方案1】:
    • 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<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();
                }
            });
        }
    }
    

    【讨论】:

    • 作为最可能最重要区别的附加指针:table.setRowSorter(sorter);,因为问题中的代码忘记了那部分。
    • 我知道这个例子,但你可以帮助我适应我的需要。现在我使用 IDE 来构建 jTable、textFields 和其他东西。在不久的将来,我计划手动构建。当我尝试使用默认模型和东西将该代码调整为我的 jTable 生成的代码时,我感到很困惑。
    • @Apopei Andrei Ionut 抱歉,我不知道如何从内置调色板执行此操作,每个操作都有属性字段,我没有理由了解 Java 和 Swing 以及 GUI编辑也是,
    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多