In Jcombobox when i type some letter say ('j'),the first item that starts with 'j' will be focussed by default.But the same logic is not applicable with many letters(say 'ji').How to make it possible in such a way that when i type 'ji' it should focus onto the first item that starts with 'ji' and so on?
Asked
Active
Viewed 481 times
3 Answers
1
In Jcombobox when i type some letter say ('j'),the first item that starts with 'j' will be focussed by default.But the same logic is not applicable with many letters(say 'ji').How to make it possible in such a way that when i type 'ji' it should focus onto the first item that starts with 'ji' and so on.
0
Implement KeyListener in subclassed JComboBox and search through JCombobox elements.

KernelPanic
- 2,328
- 7
- 47
- 90
-
The editor of a `JComboBox` is a `JTextComponent` which has better mechanisms then a `KeyListener` (e.g. a `DocumentListener`) – Robin May 24 '13 at 09:47
0
I don't like to post large things, but here is a source code that I've took years ago (don't remember where) and fixed some issue to get it working properly.
Usage :
String[] aItems = new String[] {"Ester", "Jordi", "Jordina", "Jorge", "Sergi"};
JAutoCompleteComboBox cboxInputModelNumber = new JAutoCompleteComboBox();
for(nItem = 0;nItem < lItems.size();nItem++)
{
aItems[nItem] = lItems.get(nItem).getNumber();
}
cboxInputModelNumber.getCompleter().setItems(lItems.toArray());
JAutoCompleteComboBox.java
import java.util.List;
import java.util.Vector;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
/**
*
* @author Improved by Alexandre Lavoie
*
* Source : http://www.java2s.com/Code/Java/Swing-Components/AutocompleteComboBox.htm
*/
public class JAutoCompleteComboBox extends JComboBox
{
private AutoCompleter completer;
public JAutoCompleteComboBox()
{
super();
addCompleter();
}
public JAutoCompleteComboBox(ComboBoxModel cm)
{
super(cm);
addCompleter();
}
public JAutoCompleteComboBox(Object[] items)
{
super(items);
addCompleter();
}
public JAutoCompleteComboBox(List v)
{
super((Vector) v);
addCompleter();
}
private void addCompleter()
{
setEditable(true);
completer = new AutoCompleter(this);
}
public void autoComplete(String str)
{
this.completer.autoComplete(str,str.length());
}
public String getText()
{
return ((JTextField) getEditor().getEditorComponent()).getText();
}
public void setText(String text)
{
((JTextField) getEditor().getEditorComponent()).setText(text);
}
public boolean containsItem(String itemString)
{
for(int i = 0; i < this.getModel().getSize(); i++)
{
String _item = "" + this.getModel().getElementAt(i);
if(_item.equals(itemString))
{
return true;
}
}
return false;
}
public AutoCompleter getCompleter()
{
return completer;
}
}
AutoCompleter.java
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;
import java.util.Vector;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
/**
*
* @author Improved by Alexandre Lavoie
*
* Source : http://jwms-lqik2004.googlecode.com/svn/jwms_linux_eclipse/src/com/res0w/jwms/method/AutoCompleter.java
*/
public class AutoCompleter implements KeyListener, ItemListener
{
private JComboBox m_oParent = null;
private JTextField m_oEditor = null;
private ComboBoxModel m_oModel = null;
private Object[] items;
public AutoCompleter(JComboBox comboBox)
{
m_oParent = comboBox;
m_oEditor = (JTextField) comboBox.getEditor().getEditorComponent();
m_oEditor.addKeyListener(this);
m_oModel = comboBox.getModel();
m_oParent.addItemListener(this);
}
public void keyTyped(KeyEvent e)
{
}
public void keyPressed(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
char ch = e.getKeyChar();
// TODO : Maybe catch keys that won't update the content here
{
int caretPosition = m_oEditor.getCaretPosition();
String str = m_oEditor.getText();
if(str.length() == 0)
{
m_oParent.setPopupVisible(false);
return;
}
else
{
autoComplete(str,caretPosition);
}
}
}
/**
* ×Ô¶¯Íê³É¡£¸ù¾ÝÊäÈëµÄÄÚÈÝ£¬ÔÚÁбíÖÐÕÒµ½ÏàËÆµÄÏîÄ¿.
*/
protected void autoComplete(String strf, int caretPosition)
{
Object[] opts;
opts = getMatchingOptions(strf.substring(0,caretPosition));
if(m_oParent != null)
{
m_oModel = new DefaultComboBoxModel(opts);
m_oParent.setModel(m_oModel);
}
if(opts.length > 0)
{
m_oEditor.setCaretPosition(caretPosition);
m_oEditor.setText(strf.substring(0,caretPosition));
if(m_oParent != null)
{
try
{
m_oParent.showPopup();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
else
{
m_oEditor.setText(strf);
}
}
/**
*
* ÕÒµ½ÏàËÆµÄÏîÄ¿, ²¢ÇÒ½«Ö®ÅÅÁе½Êý×éµÄ×îÇ°Ãæ¡£
* @param str
* @return ·µ»ØËùÓÐÏîÄ¿µÄÁÐ±í¡£
*/
protected Object[] getMatchingOptions(String str)
{
List v = new Vector();
for(int k = 0; k < items.length; k++)
{
Object itemObj = items[k];
if(itemObj != null)
{
String item = itemObj.toString();
if(KMPAlgorithm.kmp(item,str))
{
v.add(items[k]);
}
}
}
return v.toArray();
}
protected Object[] getMatchingOptionsDel(String str)
{
List v = new Vector();
for(int k = 0; k < items.length; k++)
{
Object itemObj = items[k];
if(itemObj != null)
{
String item = itemObj.toString().toLowerCase();
if(KMPAlgorithm.kmp(item, str))
{
v.add(items[k]);
}
}
}
return v.toArray();
}
public void itemStateChanged(ItemEvent event)
{
if (event.getStateChange() == ItemEvent.SELECTED)
{
int caretPosition = m_oEditor.getCaretPosition();
if(caretPosition != -1)
{
try
{
m_oEditor.moveCaretPosition(caretPosition);
}
catch(IllegalArgumentException ex)
{
ex.printStackTrace();
}
}
}
}
public void setItems(Object[] x)
{
items = x;
}
}
KMPAlgorithm.java
/**
*
* @author Alexandre Lavoie
*
* Source : http://jwms-lqik2004.googlecode.com/svn/jwms_linux_eclipse/src/com/res0w/jwms/method/KMPAlgorith.java
*/
public class KMPAlgorithm {
public static boolean kmp(String target, String pattern) {
/*int pLen = pattern.length();
int tLen = target.length();
//the fail function
int failFunc[] = new int[pLen];
failFunc[0] = -1;
//build fail function
for (int i = 1; i < pLen; i++) {
int j = failFunc[i - 1];
while (pattern.charAt(i) != pattern.charAt(j + 1) && j >= 0) {
//recursion
j = failFunc[j];
}
if (pattern.charAt(i) == pattern.charAt(j + 1)) {
failFunc[i] = j + 1;
} else {
failFunc[i] = -1;
}
}
int pPos = 0, tPos = 0;
while (tPos < tLen && pPos < pLen) {
if (target.charAt(tPos) == pattern.charAt(pPos)) {
//match ,then do forward
tPos++;
pPos++;
} else if (pPos == 0) {
//target go forward
tPos++;
} else {
//target postion don't change,pattern go back
pPos = failFunc[pPos - 1] + 1;
}
}
if (pPos < pLen) {
return false;
} else {
return true;
}*/
return target.toLowerCase().startsWith(pattern.toLowerCase());
}
}

Alexandre Lavoie
- 8,711
- 3
- 31
- 72