我正在尝试为 Swing 实现自动完成,JTextField
其中可能的自动完成条目集可能很大(10-100K 项)并且检索起来很昂贵,但搜索条目集相当便宜。谁能指出一个好的解决方案,最好是图书馆的形式?我查看了SwingX autocomplete,但它不是为您没有索引访问的情况而设计的。
更新:由于显然不清楚,问题不在于搜索大量条目是昂贵的(不是),而是在这种特殊情况下获取完整的条目集是昂贵且不切实际的。
我正在尝试为 Swing 实现自动完成,JTextField
其中可能的自动完成条目集可能很大(10-100K 项)并且检索起来很昂贵,但搜索条目集相当便宜。谁能指出一个好的解决方案,最好是图书馆的形式?我查看了SwingX autocomplete,但它不是为您没有索引访问的情况而设计的。
更新:由于显然不清楚,问题不在于搜索大量条目是昂贵的(不是),而是在这种特殊情况下获取完整的条目集是昂贵且不切实际的。
我对Glazed Lists很幸运。这是假设您可以将整个数据集加载到内存中并将其保存在那里。我已经完成了 20K 左右的项目。
我最终在这个答案中找到了 Samuel Sjöberg 的“ Autocompletion in Swing ”,并在此基础上实现了以下解决方案。
public class MyAutocompleteDocument extends DefaultStyledDocument {
@Override
public void insertString ( int offs, String str, AttributeSet a ) throws BadLocationException
{
if ( !StringUtils.isBlank( str ) )
{
String text = getText( 0, offs ); // Current text up to insert point
String completion = complete( text + str ); // Full completed string
if (!StringUtils.isBlank( completion )) { // not "" or null
String textToInsert = completion.substring( offs );
// Always overwrite on complete
int oldLength = getLength();
remove( offs, oldLength - offs );
super.insertString( offs, textToInsert, a );
// Select the auto-completed portion so it's easy to keep typing
owner.select( offs + str.length(), getLength() );
} else {
super.insertString( offs, str, a );
}
}
}
private String complete(String startsWith) {
// access service to search for completion
}
}
不确定它是否适用于所有情况,但它似乎涵盖了我的。