Java 中 JTable 中的查找器

Finder in a JTable in Java

我有一个程序可以将我连接到数据库并向我显示 JTable 中的所有信息。

问题是我想放一个搜索引擎,因为 table 中会有很多名字,我已经在寻找类似的例子,我试图将它们连接到我的,但我没有能,这就是为什么我请求你的帮助

    public Consulta() {
    initComponents();
    user = Start.user;

    setSize(600, 300);
    setTitle("Sesion de " + user);
    setResizable(false);
    setLocationRelativeTo(null);    

    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    
    try {

        //TextField name: txtSearch
        //Button name: btnSearch

        Connection cn = Conexion.conectar();
        PreparedStatement pst = cn.prepareStatement("select Nombre from justname");

        ResultSet rs = pst.executeQuery();

        jTable_usuarios = new JTable(model);
        jScrollPane1.setViewportView(jTable_usuarios);

        model.addColumn(" ");

        while (rs.next()) {

            Object[] fila = new Object[1];

            for (int i = 0; i < 1; i++) {
                fila[i] = rs.getObject(i + 1); //el primer indice en rs es 1 por eso se suma 1
            }

            model.addRow(fila); //se agrega la fila que encontramos dentro de model

        }

        //cerrar conexion
        cn.close();

    } catch (SQLException e) {
        System.err.println("Error al llenar la tabla. " + e);
        JOptionPane.showMessageDialog(null, "Error al mostrar informacion, ¡Contacte al administrador¡");
    }
    }

任何关于我如何做的意见、评论、建议,相信我,我将非常感激。

假设您要搜索 (buscar),而不是过滤。
在 selected 列中搜索,从 selected 行下一行开始。只需遍历 table 模型,直到找到搜索值,然后 select 该行。按钮的 ActionListener 示例:

    button.addActionListener(this::searchAction);
private void searchAction(ActionEvent ev) {
    var text = field.getText();    // text to search
    if (text.isEmpty()) {
        return;
    }
    var col = max(0, table.getSelectedColumn());    // 0 if no column selected
    var row = max(0, table.getSelectedRow());       // 0 if no row selected
    IntStream.concat(
        IntStream.range(row+1, model.getRowCount()),   // search after current row
        IntStream.rangeClosed(0, row))                 // then from row 0 up to current
    .filter(i -> (String.valueOf(model.getValueAt(i, col)).contains(text)))  // value contains search text?
    .findFirst()
    .ifPresent(i -> table.changeSelection(i, col, false, false));
}

这只是基本思路,can/should有待改进(使用正则表达式而不是包含,更好地处理null,在所有列中搜索,为空table,model/view 映射...).


可以使用正常for循环代替流:

private void searchAction(ActionEvent ev) {
    var text = field.getText();
    if (text.isEmpty()) {
        return;
    }
    var col = max(0, table.getSelectedColumn());
    var row = max(0, table.getSelectedRow());
    for (var i = 0; i < model.getRowCount(); i++) {
        var j = (i + row + 1) % model.getRowCount();
        if (String.valueOf(model.getValueAt(j, col)).contains(text)) {
            table.changeSelection(j, col, false, false);
            break;
        }
    }
}