java - 在 JTable 中搜索通过 JTextField 数据输入的数据

标签 java swing jtable jtextfield

我有一个 JTable,其中填充了数据库中的数据。我添加了一个搜索功能,当数据输入 JTextField 时,该功能会突出显示单元格。但是当您必须输入确切的单词或数字时,我想做的是能够搜索几个字母或数字,并且 JTable 将显示包含这些字母或数字的结果。

我尝试过使用:

button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String text = jTextField1.getText();
            if (text.length() == 0) {
                sorter.setRowFilter(null);
            } else {
                sorter.setRowFilter(RowFilter.regexFilter(text));
            }
        }
    });

但它似乎确实影响了 JTable。

所以我使用了这段代码:

private class HighlightRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        // everything as usual
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // added behavior
        if(row == table.getSelectedRow()) {

            // this will customize that kind of border that will be use to highlight a row
            setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
        }

        return this;
    }
}

private void searchResultsActionPerformed(ActionEvent evt) {
    String value = jTextField1.getText();

    for (int row = 0; row <= table.getRowCount() - 1; row++) {

        for (int col = 0; col <= table.getColumnCount() - 1; col++) {

            if (value.equals(table.getValueAt(row, col))) {

                // this will automatically set the view of the scroll in the location of the value
                table.scrollRectToVisible(table.getCellRect(row, 0, true));

                // this will automatically set the focus of the searched/selected row/value
                table.setRowSelectionInterval(row, row);

                for (int i = 0; i <= table.getColumnCount() - 1; i++) {

                    table.getColumnModel().getColumn(i).setCellRenderer(new HighlightRenderer());
                }
            }
        }
    }
}

它使用输入到 JTextField 中的数据来工作,但就像我之前提到的,您必须输入确切的名称或数字。这不是我想要的工作方式。

感谢任何帮助。

最佳答案

你的测试

value.equals(table.getValueAt(row, col))

导致您所描述的行为。 equals 仅适用于完全匹配。

你可以尝试一些更复杂的东西,比如

Object value = table.getValueAt(row, col);
if (value!=null && value.toString().matches(".*"+Pattern.quote(text)+".*"))
   ...

就个人而言,我会在渲染器中执行此测试,以便突出显示所有匹配的单元格(您仍然需要执行 scrollRect() 但不在渲染器中执行):

private class HighlightRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        // everything as usual
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // added behavior
        if (value!=null && value.toString().matches(".*"+Pattern.quote(text)+".*")) {

            // this will customize that kind of border that will be use to highlight a row
            setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
        } else
            setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1);

        return this;
    }
}

每当调用 actionPerformed 时,我都会调用 table.repaint();

关于java - 在 JTable 中搜索通过 JTextField 数据输入的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130272/

相关文章:

java - Spring Data Jpa findOne 方法返回托管实体吗?

java - 使从服务器获取的图像实时显示

swing - JTable setCellRenderer 将文本字段格式化为最新?

java - 如何获取 JTable 中的文本?

java - 使用 rowInModel 或 rowInTable 获取 JTable 单元格值?

java - Java 数组在 HotSpot 中使用内存的精确程度如何(即多少 slop)?

java - 将值从 JavaScript 发送到 JSP(使用 jQuery)

java - 如何在java中随机绘制的图像上添加mouselistener?

java - 将 arraylist 数据添加到 JTable

java - 随机替换密码 Java