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;
}
}
}
我有一个程序可以将我连接到数据库并向我显示 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;
}
}
}