java swing jtable case-sensitive rowfilter

Filtro JTable basado en un jtextfield NON Case Sensitive(Java)



swing case-sensitive (3)

Ya puedo filtrar JTable usando JTextField, el problema es que distingue entre mayúsculas y minúsculas. Por ejemplo, tengo este nombre en el Jtable: "Guillian Fox", si escribo "guillian fox" o "GUILLIAN FOX" en el campo de texto, el nombre no se muestra.

Sé que Java tiene métodos .toLowerCase o .toUpperCase, pero el problema al usar esos métodos es que el resultado será antiestético, porque ambos tienen que ser mayúsculas o minúsculas, cuando lo apropiado sería la primera letra en mayúsculas, porque son nombres

Las filas de JTable son de una consulta en una base de datos. Entonces, la solución que estaba pensando es no hacer el filtro directamente en el jtable, en vez de eso, hacer una consulta que filtre los resultados, pero creo que es muy ineficiente dado que haré una consulta para cada carácter insertado o eliminado de el campo de texto

@Override public void changedUpdate(DocumentEvent arg0) { ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0)); } @Override public void insertUpdate(DocumentEvent arg0) { ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0)); } @Override public void removeUpdate(DocumentEvent arg0) { ordenador.setRowFilter(RowFilter.regexFilter(jtxtfBuscarInv.getText(), 0)); }


Puedes hacer algo como esto (copiado casi como está del documento de Java)

public class ContainsIgnoreCaseFilter extends RowFilter<Object, Object> { private final String match; public ContainsIgnoreCaseFilter(String match) { this.match = match.toLowerCase(); } @Override public boolean include(javax.swing.RowFilter.Entry<? extends Object, ? extends Object> entry) { for (int i = entry.getValueCount() - 1; i >= 0; i--) { if (entry.getStringValue(i).toLowerCase().contains(match)) { return true; } } return false; } };

Esto debe coincidir con cualquier fila que tenga al menos un campo donde la representación textual contenga la cadena con la que crea el emparejador. El tipo podría tener que ajustarse a su modelo.


para ignorar CaseWhatever

ordenador.setRowFilter(RowFilter.regexFilter("(?i)" + text));

pero para los launguages ​​que no sean ASCII, debe verificar cuatro teclas (2x2) en línea con / cerca de Big ENTER en el teclado,

Si respondió este problema, debe excluir estas cuatro teclas del teclado y escribir su propia matriz para UpperCase y LoverCase.


Tal vez alguien ayudará mi solución. Mi problema: tengo JTable, los datos en JTable contienen caracteres nacionales (con acutes y cuñas). Tengo JTextField como entrada en RowFilter.

En JTextField tengo DocumentListener:

textFielInput.getDocument().addDocumentListener(new DocumentListener(){ @Override public void changedUpdate(DocumentEvent e){ applyFilter(); } @Override public void insertUpdate(DocumentEvent e){ applyFilter(); } @Override public void removeUpdate(DocumentEvent e){ applyFilter(); }

});

Entonces la implementación de RowFilter:

private void applyFilter() { RowFilter<MyTableModel, Integer> filter = null; final String filteringText = this.textFielInput.getText().toLowerCase(new Locale("cs_CZ")); filter = new RowFilter<MyTableModel, Integer>() { @Override public boolean include(Entry<? extends MyTableModel, ? extends Integer> entry) { for(int i = entry.getValueCount() - 1; i >= 0; i--) { String filteredField = entry.getStringValue(i).toLowerCase(new Locale("cs_CZ")); if(filteredField.contains(filteringText)) { return true; } } return false; } }; } this.sorter.setRowFilter(filter);

y por supuesto uno necesitará clasificador:

sorter = new TableRowSorter<MyTableModel>(new MyTableModel());

De esta forma, no importa si el texto pegado en el cuadro de búsqueda es superior o inferior y no importa si los datos en JTable son más bajos o más altos + se traducen de arriba a abajo en función de la configuración regional definida.

Hope ayudará.