I have googled alot exampled to create auto complete jcombo box, found many libraries also codes but they are pretty much complex, has any one idea to create this as easy as possible????
mKorbel 274 Veteran Poster
for me google works as expected, take only code from java2.com, there is workaround in two classes, one for JComboBox, 2nd. for JtextField (and this one I love so much with redirect the suggestion to the JDialog/JWindow)
1/ you can set if is strict or not
2/ no performance issues as I know
3/ without dirty hack as in another examples
4/ made by one guru from died Sun
Edited by mKorbel because: n/a
Majestics 84 Posting Pro
http://www.java2s.com/Code/Java/Swing-Components/AutocompleteComboBox.htm
I have used the example listed here. It work fine upto 100 items. but when i increase items to 1000 or above it speed get super slow, even my processor is 2.66 C2Q , so what i will expect from pentium 4 having 512 ram ... Major issue is performance... Any idea to enhance it????
And thank you for the above link...... You are a nice friend of mine... In todays world people like you are very rare...
Edited by Majestics because: n/a
mKorbel 274 Veteran Poster
1) just to sort array before use (that job only for SQL Server, never for local PC), around me is implementations for 5-6T Items, and runs on OLDIES HP d530 RAM 256-768/HDD20-40Gb, and defragment HDD
2) I know about that, but "don't speak about nothing", for each instance you have created new ClassesPair, if (in same time) you want to use 6 AutoCompeted JComponents, then you have to clone this two clases 6times with different names, nothing else, sure if you'll more skills then is pretty to possible to change this premature search engine to the binary search from HashMap, but lazyness is endless lazyness in my case, and wins always over any of ideas
3) add all @overide (IDE can identify that easilly)
Majestics 84 Posting Pro
Well i now i m trying to create my own jcombo box with edit feature
set key listener
if keys are type able then
take the char and search in the combo box and pop combo box
Problem is in jcombo box how can i know that what user has pressed previosuly....
I mean i can record each char on its turn but not before that char... Any idea...
Simple Example is if user press a b c , how to get a when user press b because we cant get text in jcombo box....
peter_budo 2,532 Code tags enforcer Team Colleague Featured Poster
http://www.java2s.com/Code/Java/Swing-Components/AutocompleteComboBox.htm
I have used the example listed here. It work fine upto 100 items. but when i increase items to 1000 or above it speed get super slow, even my processor is 2.66 C2Q , so what i will expect from pentium 4 having 512 ram ... Major issue is performance... Any idea to enhance it????
And thank you for the above link...... You are a nice friend of mine... In todays world people like you are very rare...
If I see someone implementing such thing I'm ready to commit homicide. If you want to implement something like that then there is something seriously wrong with your design(side reading would be some article or book on HCI {Human_computer interaction}).
If you can explain what you trying to achieve we may come up with some more pleasant solution, example text box populating table in scroll pane, that is activated only when you type 3 or more letters, table get refreshed as you type more letters which will narrow search results...
Majestics 84 Posting Pro
Oh... I simply want this
----------------------
a
----------------------
a
ab
abc
abcd
-----------------------
ab
-----------------------
ab
abc
abcd
Consider two line a combo box and when i enter "a" all hints regarding to "a" comes , when i proceed to "ab" hints referesh and filter suitable data..
:) Similar when i press back space... Its a normal google search box. But no autocomplete.
Majestics 84 Posting Pro
Check this out... Its perfect Example
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.text.*;
/* This work is hereby released into the Public Domain.
* To view a copy of the public domain dedication, visit
* http://creativecommons.org/licenses/publicdomain/
*/
public class AutoCompletion extends PlainDocument {
JComboBox comboBox;
ComboBoxModel model;
JTextComponent editor;
// flag to indicate if setSelectedItem has been called
// subsequent calls to remove/insertString should be ignored
boolean selecting=false;
boolean hidePopupOnFocusLoss;
boolean hitBackspace=false;
boolean hitBackspaceOnSelection;
KeyListener editorKeyListener;
FocusListener editorFocusListener;
public AutoCompletion(final JComboBox comboBox) {
this.comboBox = comboBox;
model = comboBox.getModel();
comboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!selecting) highlightCompletedText(0);
}
});
comboBox.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().equals("editor")) configureEditor((ComboBoxEditor) e.getNewValue());
if (e.getPropertyName().equals("model")) model = (ComboBoxModel) e.getNewValue();
}
});
editorKeyListener = new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (comboBox.isDisplayable()) comboBox.setPopupVisible(true);
hitBackspace=false;
switch (e.getKeyCode()) {
// determine if the pressed key is backspace (needed by the remove method)
case KeyEvent.VK_BACK_SPACE : hitBackspace=true;
hitBackspaceOnSelection=editor.getSelectionStart()!=editor.getSelectionEnd();
break;
// ignore delete key
case KeyEvent.VK_DELETE : e.consume();
comboBox.getToolkit().beep();
break;
}
}
};
// Bug 5100422 on Java 1.5: Editable JComboBox won't hide popup when tabbing out
hidePopupOnFocusLoss=System.getProperty("java.version").startsWith("1.5");
// Highlight whole text when gaining focus
editorFocusListener = new FocusAdapter() {
public void focusGained(FocusEvent e) {
highlightCompletedText(0);
}
public void focusLost(FocusEvent e) {
// Workaround for Bug 5100422 - Hide Popup on focus loss
if (hidePopupOnFocusLoss) comboBox.setPopupVisible(false);
}
};
configureEditor(comboBox.getEditor());
// Handle initially selected object
Object selected = comboBox.getSelectedItem();
if (selected!=null) setText(selected.toString());
highlightCompletedText(0);
}
public static void enable(JComboBox comboBox) {
// has to be editable
comboBox.setEditable(true);
// change the editor's document
new AutoCompletion(comboBox);
}
void configureEditor(ComboBoxEditor newEditor) {
if (editor != null) {
editor.removeKeyListener(editorKeyListener);
editor.removeFocusListener(editorFocusListener);
}
if (newEditor != null) {
editor = (JTextComponent) newEditor.getEditorComponent();
editor.addKeyListener(editorKeyListener);
editor.addFocusListener(editorFocusListener);
editor.setDocument(this);
}
}
public void remove(int offs, int len) throws BadLocationException {
// return immediately when selecting an item
if (selecting) return;
if (hitBackspace) {
// user hit backspace => move the selection backwards
// old item keeps being selected
if (offs>0) {
if (hitBackspaceOnSelection) offs--;
} else {
// User hit backspace with the cursor positioned on the start => beep
comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
}
highlightCompletedText(offs);
} else {
super.remove(offs, len);
}
}
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
// return immediately when selecting an item
if (selecting) return;
// insert the string into the document
super.insertString(offs, str, a);
// lookup and select a matching item
Object item = lookupItem(getText(0, getLength()));
if (item != null) {
setSelectedItem(item);
} else {
// keep old item selected if there is no match
item = comboBox.getSelectedItem();
// imitate no insert (later on offs will be incremented by str.length(): selection won't move forward)
offs = offs-str.length();
// provide feedback to the user that his input has been received but can not be accepted
comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
}
setText(item.toString());
// select the completed part
highlightCompletedText(offs+str.length());
}
private void setText(String text) {
try {
// remove all text and insert the completed string
super.remove(0, getLength());
super.insertString(0, text, null);
} catch (BadLocationException e) {
throw new RuntimeException(e.toString());
}
}
private void highlightCompletedText(int start) {
editor.setCaretPosition(getLength());
editor.moveCaretPosition(start);
}
private void setSelectedItem(Object item) {
selecting = true;
model.setSelectedItem(item);
selecting = false;
}
private Object lookupItem(String pattern) {
Object selectedItem = model.getSelectedItem();
// only search for a different item if the currently selected does not match
if (selectedItem != null && startsWithIgnoreCase(selectedItem.toString(), pattern)) {
return selectedItem;
} else {
// iterate over all items
for (int i=0, n=model.getSize(); i < n; i++) {
Object currentItem = model.getElementAt(i);
// current item starts with the pattern?
if (currentItem != null && startsWithIgnoreCase(currentItem.toString(), pattern)) {
return currentItem;
}
}
}
// no item starts with the pattern => return null
return null;
}
// checks if str1 starts with str2 - ignores case
private boolean startsWithIgnoreCase(String str1, String str2) {
return str1.toUpperCase().startsWith(str2.toUpperCase());
}
private static void createAndShowGUI() {
// the combo box (add/modify items if you like to)
final JComboBox comboBox = new JComboBox(new Object[] {"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
enable(comboBox);
// create and show a window containing the combo box
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(3);
frame.getContentPane().add(comboBox);
frame.pack(); frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
peter_budo commented: Thanx for sharing +16
Be a part of the DaniWeb community
We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.