2010-07-14 9 views
0

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

1

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é.

1

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(); 
    } 
}); 
    } 
} 
0

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.