请高手指点 100分送上 用jcombobox怎么能实现和IE地址栏一样的显示功能 我估计需要些自定义类才行,用java的默认行为?估计不行。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你在jcombobox下面再放个List然后写一个modifyText(ModifyEvent)处理jcombobox中输入的文本改变的事件怎么注册事件处理不用说了吧当然你要有以前输入的历史纪录才可能给出提示所以还得有一个函数来匹配历史纪录文件中与输入匹配的结果在modifyText(ModifyEvent)把这些结果放到List里的item中如果要实现你要的效果就得没输入一次就匹配一次用来更新List中的item当然还要做一些改动 比如说按键的处理 这个可以根据List是否可见来处理还有一些别的 自己处理吧大概思路就是这样了 *^-^* 首先将你的JComboBox设为EditEnable然后,作一个KeyListener或ChanagerListener对你的JCombobox进行监听,然后,当输入的数值有变化的时候,指向你的JCombobox对象的第几条, 思路就是这么简单,而自动查找的算法,任何一个对编程不陌生的人都可以写出。以下我列出完整的程序代码: 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.JFrame; import javax.swing.JTextField; 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 static void main(String[] args) { JFrame frame = new JFrame(); Object[] items = new Object[] { "abc", "aab", "aba", "hpp", "pp", "hlp" }; DefaultComboBoxModel model = new DefaultComboBoxModel(); JComboBox cmb = new JAutoCompleteComboBox(model); model.addElement("abc"); model.addElement("aab"); model.addElement("aba"); model.addElement("hpp"); model.addElement("pp"); model.addElement("hlp"); frame.getContentPane().add(cmb); frame.setSize(400, 80); frame.setVisible(true); } } /** * 自动完成器。自动找到最匹配的项目,并排在列表的最前面。 * * @author Turbo Chen */class AutoCompleter implements KeyListener, ItemListener { private JComboBox owner = null; private JTextField editor = null;private ComboBoxModel model = null; public AutoCompleter(JComboBox comboBox) { owner = comboBox; editor = (JTextField) comboBox.getEditor().getEditorComponent(); editor.addKeyListener(this);model = comboBox.getModel(); owner.addItemListener(this); } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { char ch = e.getKeyChar(); if (ch == KeyEvent.CHAR_UNDEFINED Character.isISOControl(ch) ch == KeyEvent.VK_DELETE) return; int caretPosition = editor.getCaretPosition(); String str = editor.getText(); if (str.length() == 0) return; autoComplete(str, caretPosition); } /** * 自动完成。根据输入的内容,在列表中找到相似的项目. */ protected void autoComplete(String strf, int caretPosition) { Object[] opts; opts = getMatchingOptions(strf.substring(0, caretPosition)); if (owner != null) { model = new DefaultComboBoxModel(opts); owner.setModel(model); } if (opts.length > 0) { String str = opts[0].toString(); editor.setCaretPosition(caretPosition); if (owner != null) { try { owner.showPopup(); } catch (Exception ex) { ex.printStackTrace(); } } } } /** * * 找到相似的项目, 并且将之排列到数组的最前面。 * @param str * @return 返回所有项目的列表。 */ protected Object[] getMatchingOptions(String str) { List v = new Vector(); List v1 = new Vector(); for (int k = 0; k < model.getSize(); k++) { Object itemObj = model.getElementAt(k); if ( itemObj!=null ) { String item = itemObj.toString().toLowerCase(); if (item.startsWith(str.toLowerCase())) v.add(model.getElementAt(k)); else v1.add(model.getElementAt(k)); }else v1.add(model.getElementAt(k)); } for (int i = 0; i < v1.size(); i++) { v.add(v1.get(i)); } if (v.isEmpty()) v.add(str); return v.toArray(); } public void itemStateChanged(ItemEvent event) { if (event.getStateChange() == ItemEvent.SELECTED) { int caretPosition = editor.getCaretPosition(); if (caretPosition != -1) { try { editor.moveCaretPosition(caretPosition); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } } } }} 改装思路如下: 1. 先继承一个JComboBox类,将其setEditable为true. 这样的话,用户才可以在combobox上输入文字。 2. 我们知道combobox的输入框是一个JTextField, 可以通过comboBox.getEditor().getEditorComponent()取得这个文本框。 3. 为这个文本框加上一个KeyListener. 4. 当用户在文本框中按键时,会解发keyReleased事件,我们在这个事件里写主要的实现自动查找和完成的代码。 求一文本信息抽取java代码(对于您来说很简单) 各位高手,求指点。给出一组英文单词,用hash table with separate chaining 找出出现的频率。 object和object数组什么联系和区别? 关于import的一点问题 JTable的Tab鍵事件 文件调用路径问题 100分, 訪問EJB方法, 客戶端錯誤!!!!!!! java有个日期的问题,十分火急,请指教,谢了。 关于判断语句 请问国内企业哪些是微软的走狗? 发几篇swing中关于JTable中的运用-5 在线散分50请高手用程序实现floatToString,请关注,多谢
然后写一个modifyText(ModifyEvent)处理jcombobox中输入的文本改变的事件
怎么注册事件处理不用说了吧
当然你要有以前输入的历史纪录才可能给出提示
所以还得有一个函数来匹配历史纪录文件中与输入匹配的结果
在modifyText(ModifyEvent)把这些结果放到List里的item中
如果要实现你要的效果就得没输入一次就匹配一次用来更新List中的item
当然还要做一些改动 比如说按键的处理 这个可以根据List是否可见来处理
还有一些别的 自己处理吧
大概思路就是这样了
*^-^*
然后,作一个KeyListener或ChanagerListener对你的JCombobox进行监听,
然后,当输入的数值有变化的时候,指向你的JCombobox对象的第几条,
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.JFrame;
import javax.swing.JTextField; 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 static void main(String[] args)
{
JFrame frame = new JFrame(); Object[] items = new Object[]
{ "abc", "aab", "aba", "hpp", "pp", "hlp" };
DefaultComboBoxModel model = new DefaultComboBoxModel(); JComboBox cmb = new JAutoCompleteComboBox(model);
model.addElement("abc");
model.addElement("aab");
model.addElement("aba");
model.addElement("hpp");
model.addElement("pp");
model.addElement("hlp"); frame.getContentPane().add(cmb);
frame.setSize(400, 80);
frame.setVisible(true); }
}
/**
* 自动完成器。自动找到最匹配的项目,并排在列表的最前面。
*
* @author Turbo Chen
*/class AutoCompleter implements KeyListener, ItemListener { private JComboBox owner = null;
private JTextField editor = null;private ComboBoxModel model = null; public AutoCompleter(JComboBox comboBox)
{
owner = comboBox;
editor = (JTextField) comboBox.getEditor().getEditorComponent();
editor.addKeyListener(this);
model = comboBox.getModel();
owner.addItemListener(this);
} public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e)
{
char ch = e.getKeyChar();
if (ch == KeyEvent.CHAR_UNDEFINED
Character.isISOControl(ch)
ch == KeyEvent.VK_DELETE)
return; int caretPosition = editor.getCaretPosition();
String str = editor.getText();
if (str.length() == 0)
return;
autoComplete(str, caretPosition); }
/**
* 自动完成。根据输入的内容,在列表中找到相似的项目.
*/
protected void autoComplete(String strf, int caretPosition)
{
Object[] opts;
opts = getMatchingOptions(strf.substring(0, caretPosition));
if (owner != null)
{
model = new DefaultComboBoxModel(opts);
owner.setModel(model);
}
if (opts.length > 0)
{ String str = opts[0].toString(); editor.setCaretPosition(caretPosition); if (owner != null)
{
try
{ owner.showPopup(); } catch (Exception ex)
{
ex.printStackTrace();
}
} }
}
/**
*
* 找到相似的项目, 并且将之排列到数组的最前面。
* @param str
* @return 返回所有项目的列表。
*/
protected Object[] getMatchingOptions(String str)
{ List v = new Vector();
List v1 = new Vector();
for (int k = 0; k < model.getSize(); k++)
{
Object itemObj = model.getElementAt(k); if ( itemObj!=null )
{
String item = itemObj.toString().toLowerCase();
if (item.startsWith(str.toLowerCase()))
v.add(model.getElementAt(k));
else
v1.add(model.getElementAt(k));
}else
v1.add(model.getElementAt(k)); }
for (int i = 0; i < v1.size(); i++)
{
v.add(v1.get(i));
}
if (v.isEmpty())
v.add(str);
return v.toArray();
} public void itemStateChanged(ItemEvent event)
{
if (event.getStateChange() == ItemEvent.SELECTED)
{ int caretPosition = editor.getCaretPosition(); if (caretPosition != -1)
{
try
{
editor.moveCaretPosition(caretPosition);
} catch (IllegalArgumentException ex)
{
ex.printStackTrace();
}
} }
}
}
1. 先继承一个JComboBox类,将其setEditable为true. 这样的话,用户才可以在combobox上输入文字。
2. 我们知道combobox的输入框是一个JTextField, 可以通过comboBox.getEditor().getEditorComponent()取得这个文本框。
3. 为这个文本框加上一个KeyListener.
4. 当用户在文本框中按键时,会解发keyReleased事件,我们在这个事件里写主要的实现自动查找和完成的代码。