J'ai créé avec Java Swing une fenêtre de dialogue qui présente dans une JTable une liste d'éléments. Je voudrais mettre en place une sorte de fonctions de recherche. Quelqu'un peut-il me suggérer la meilleure façon de mettre en œuvre une telle fonctionnalité?Recherche dans JTable
Répondre
Lisez l'API JTable et suivez le lien vers le didacticiel Swing sur "Comment utiliser les tables". Vous y trouverez une section sur "Tri et Filtrage" qui donne un exemple d'utilisation d'un champ de texte pour rechercher des lignes contenant le texte spécifié.
Ceci est un moyen de mettre en œuvre la recherche dans un JTable:
public class JTableSearchAndHighlight extends JFrame {
private JTextField searchField;
private JTable table;
private JPanel panel;
private JScrollPane scroll;
public JTableSearchAndHighlight() {
initializeInventory();
}
private void initializeInventory() {
panel = new JPanel();
searchField = new JTextField();
panel.setLayout(null);
final String[] columnNames = {"Name", "Surname", "Age"};
final Object[][] data = {{"Jhon", "Java", "23"}, {"Stupid", "Stupido", "500"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Michael", "Winnie", "20"}, {"Winnie", "Thepoor", "23"},
{"Max", "Dumbass", "10"}, {"Melanie", "Martin", "500"},
{"Jollibe", "Mcdonalds", "15"}};
table = new JTable(data, columnNames);
table.setColumnSelectionAllowed(true);
table.setRowSelectionAllowed(true);
scroll = new JScrollPane(table);
scroll.setBounds(0, 200, 900, 150);
searchField.setBounds(10, 100, 150, 20);
searchField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String value = searchField.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());
}
}
}
}
}
});
panel.add(searchField);
panel.add(scroll);
getContentPane().add(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Inventory Window");
setSize(900, 400);
setLocationRelativeTo(null);
setVisible(true);
}
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(2, 1, 2, 1, Color.BLACK));
}
return this;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JTableSearchAndHighlight();
}
});
}
}
Jetez un oeil à SwingX, et son JXTable
. SwingX fournit un ensemble de composants qui étendent les composants Swing normaux et leur ajoute des fonctionnalités supplémentaires. Mes favoris sont MultiSplitPane
(qui est une alternative à JSplitPane et vous permet de diviser les panneaux dans un certain nombre de sections redimensionnables) et JXTable
qui est juste comme un JTable
, mais a également une fonctionnalité de recherche intégrée (et lié à Ctrl-F) et vous pouvez trier/filtrer les lignes. Des trucs sympa. Tout ce que vous devez faire est d'importer la bibliothèque, changez votre JTable
en JXTable
(initié de la même manière), et voilà!
Espérons que ça aide.
- 1. comment remplir JTextFields avec les colonnes d'une recherche JTable?
- 2. cellule d'édition dans JTable
- 3. Filtrage automatique dans JTable
- 4. ResultSet dans JTable
- 5. JCheckBox dans jtable
- 6. chaînes d'affichage dans JTable
- 7. Inverser la sélection dans JTable
- 8. Format Date dans Jtable/ResultSet
- 9. Déplacement d'une ligne dans jtable
- 10. CellEditors mutuellement exclusifs dans JTable
- 11. En-têtes verticaux dans JTable?
- 12. Fusion de cellules dans JTable
- 13. BeansBinding un JTable dans NetBeans
- 14. Personnalisation jTable
- 15. JTable Autoscroll
- 16. JTable problème
- 17. composant JavaFX qui émule JTable
- 18. JTable: Aucune ligne sélectionnée
- 19. Données SQL et JTable
- 20. JTable colonne spanning
- 21. Événement JTable onchange
- 22. JTable utilisant Swing
- 23. édition jtable - java
- 24. Java JTable Problèmes TableCellRenderer
- 25. État initial de autoCreateRowSorter dans Swing JTable
- 26. ajouter JButton dans le cadre avec JTable
- 27. JTable pouvant enregistrer dans un fichier
- 28. Afficher directement l'enregistrement XML dans l'enregistrement jtable
- 29. JAVA: Mettre l'image dans la cellule jTable
- 30. Colonne déplacée événement [terminé] dans JTable