O'Reilly logo

Swing Hacks by Chris Adamson, Joshua Marinacci

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

136
|
Chapter 3, Tables and Trees
#26 Search Through JTables Easily
HACK
First, add a field with the row index in the inner table model. You’ll use this
to link back to that row later in the row-to-model index. Each field needs a
name and a value, so create a constant called
ROW_NUMBER
that you’ll refer to
later when retrieving the links:
Document document = new Document( );
document.add(new Field(ROW_NUMBER, "" + row, true, true, true));
//more indexing to come
writer.addDocument(document);
Then, iterate through all of the columns and add a Field for each column
name/value pair:
for (int column=0; column < tableModel.getColumnCount( ); column++){
String columnName = tableModel.getColumnName(column);
String columnValue = String.valueOf(
tableModel.getValueAt(row, column)
).toLowerCase( );
document.add(new Field(columnName, columnValue, true, true, true));
}
Searching
There are two parts to the searching. First, you have to hit the Lucene index
with a search string. This will give you a list of rows in the inner table model
that match the search. Then you need to reset the row-to-model index,
pointing to those rows.
Getting results from the index. To actually get the search results, you need an
IndexSearcher that speaks to the index and returns your search results:
IndexSearcher is = new IndexSearcher(directory);
You want to make sure all of the fields get searched, so iterate through the
table model and put all of the column names in an array that you’ll pass into
the Lucene search call:
String[] fields = new String[tableModel.getColumnCount( )];
for (int t=0; t<tableModel.getColumnCount( ); t++){
fields[t]=tableModel.getColumnName(t);
}
Next, create a Query object to pass to the IndexSearcher; there is a helper
method on
MultiFieldQueryParser to do just that. Pass it the fields you want
to search, your search
String, and the analyzer:
Query query = MultiFieldQueryParser.parse(searchString, fields, analyzer);
Then run the search. Hits is the object type returned by the search call.
You’ll process the hits in the next section when you map the results back to
the inner table model:
Hits hits = is.search(query);

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required