Java JCombobox键盘输入速度
我有一个JCombobox,上面有一长串项目。 为了快速访问,您始终可以键入所需的项目,组合框将引导您找到列表中的项目。 问题是,您需要键入的速度相当高,如果您键入项目的速度减慢,组合框将引导您转到列表中的其他项目 我想知道JCombobox中是否有一个属性,或者是否有一种方法可以在键盘输入忘记之前在内存中保存更长的时间Java JCombobox键盘输入速度,java,performance,swing,keyboard,jcombobox,Java,Performance,Swing,Keyboard,Jcombobox,我有一个JCombobox,上面有一长串项目。 为了快速访问,您始终可以键入所需的项目,组合框将引导您找到列表中的项目。 问题是,您需要键入的速度相当高,如果您键入项目的速度减慢,组合框将引导您转到列表中的其他项目 我想知道JCombobox中是否有一个属性,或者是否有一种方法可以在键盘输入忘记之前在内存中保存更长的时间 提前感谢。默认的KeySelectionManager只需硬编码1秒的延迟即可组合键或启动新搜索,因此您需要创建一个自定义KeySelectionManager,允许您配置搜索
提前感谢。默认的KeySelectionManager只需硬编码1秒的延迟即可组合键或启动新搜索,因此您需要创建一个自定义KeySelectionManager,允许您配置搜索延迟。查看
basicComboxUI
类中的默认代码
以下或多或少是该代码的副本。它有点复杂,因为它不能直接访问JList
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
import javax.swing.text.*;
public class ComboBoxKeySelection extends JPanel
{
JComboBox<String> comboBox;
public ComboBoxKeySelection()
{
String[] data =
{
" 1", " 2", " 3", " 4",
"a", "ab", "abc", "abcd",
"b1", "b2", "b3", "b4", "be",
"c", "d", "e", "f"
};
comboBox = new JComboBox<String>( data );
add( comboBox );
UIManager.put("ComboBox.timeFactor", 3000);
comboBox.setKeySelectionManager( new MyKeySelectionManager(comboBox) );
}
static class MyKeySelectionManager implements JComboBox.KeySelectionManager
{
private JComboBox comboBox;
private JList listBox;
private boolean useComboBoxModel;
private int timeFactor;
private long lastTime;
private long time;
private String prefix = "";
private String typedString = "";
public MyKeySelectionManager(JComboBox comboBox)
{
this.comboBox = comboBox;
int uiTimeFactor = UIManager.getInt("ComboBox.timeFactor");
timeFactor = (uiTimeFactor == 0) ? 1000 : uiTimeFactor;
// Get the JList used by the UI to hold the comboBox entries
Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
if (child instanceof BasicComboPopup)
{
BasicComboPopup popup = (BasicComboPopup)child;
listBox = popup.getList();
useComboBoxModel = false;
}
else
{
listBox = new JList();
useComboBoxModel = true;
}
}
public int selectionForKey(char aKey, ComboBoxModel aModel)
{
// Not using the basic UI so build our own JList to search
if (useComboBoxModel)
{
listBox.setModel( aModel );
}
time = System.currentTimeMillis();
boolean startingFromSelection = true;
int startIndex = comboBox.getSelectedIndex();
if (time - lastTime < timeFactor)
{
typedString += aKey;
if((prefix.length() == 1) && (aKey == prefix.charAt(0)))
{
// Subsequent same key presses move the keyboard focus to the next
// object that starts with the same letter.
startIndex++;
}
else
{
prefix = typedString;
}
}
else
{
startIndex++;
typedString = "" + aKey;
prefix = typedString;
}
lastTime = time;
if (startIndex < 0 || startIndex >= aModel.getSize())
{
startingFromSelection = false;
startIndex = 0;
}
int index = listBox.getNextMatch(prefix, startIndex, Position.Bias.Forward);
if (index < 0 && startingFromSelection)
{
// wrap
index = listBox.getNextMatch(prefix, 0, Position.Bias.Forward);
}
return index;
}
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("ComboBoxKeySelection");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new ComboBoxKeySelection() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.plaf.basic.*;
导入javax.swing.text.*;
公共类ComboxKeysElection扩展了JPanel
{
JComboBox组合框;
公共选举()
{
字符串[]数据=
{
" 1", " 2", " 3", " 4",
“a”、“ab”、“abc”、“abcd”,
“b1”、“b2”、“b3”、“b4”、“be”,
“c”、“d”、“e”、“f”
};
comboBox=新的JComboBox(数据);
添加(组合框);
UIManager.put(“ComboBox.timeFactor”,3000);
setKeySelectionManager(新的MyKeySelectionManager(comboBox));
}
静态类MyKeySelectionManager实现JComboBox.KeySelectionManager
{
专用JComboBox组合框;
私人JList列表框;
私有布尔模型;
私人时间因素;
私人长时间;
私人时间长;
私有字符串前缀=”;
私有字符串typedString=“”;
公共MyKeySelectionManager(JComboBox组合框)
{
this.comboBox=组合框;
int-uiTimeFactor=UIManager.getInt(“ComboBox.timeFactor”);
timeFactor=(uiTimeFactor==0)?1000:uiTimeFactor;
//获取UI用于保存组合框条目的JList
对象子对象=comboBox.getAccessibleContext().getAccessibleChild(0);
if(basicmbopopup的子实例)
{
BasicComboPopup=(BasicComboPopup)子项;
listBox=popup.getList();
UseComboxModel=false;
}
其他的
{
listBox=new JList();
UseComboxModel=true;
}
}
公共int-selectionForKey(char-aKey、ComboBoxModel-aModel)
{
//不使用基本UI,因此构建我们自己的JList进行搜索
如果(使用ComboboxModel)
{
setModel(aModel);
}
时间=System.currentTimeMillis();
boolean startingFromSelection=true;
int startIndex=comboBox.getSelectedIndex();
if(时间-上次时间<时间因素)
{
typedString+=aKey;
if((prefix.length()=1)和&(aKey==prefix.charAt(0)))
{
//随后按相同的键将键盘焦点移动到下一个
//以相同字母开头的对象。
startIndex++;
}
其他的
{
前缀=类型字符串;
}
}
其他的
{
startIndex++;
typedString=“”+aKey;
前缀=类型字符串;
}
lastTime=时间;
if(startIndex<0 | | startIndex>=aModel.getSize())
{
startingFromSelection=false;
startIndex=0;
}
int index=listBox.getNextMatch(前缀,startIndex,Position.Bias.Forward);
if(索引<0&&startingFromSelection)
{
//包裹
index=listBox.getNextMatch(前缀,0,Position.Bias.Forward);
}
收益指数;
}
}
私有静态void createAndShowUI()
{
JFrame=新JFrame(“ComboBoxKeySelection”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新ComboBoxKeySelection());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
createAndShowUI();
}
});
}
}
非此搜索基于双击的系统属性,从未尝试更改JList或JCOMBOBOX的此属性,但whan数组排序不会导致此问题,对于大量项目(cca 1k)>找到此问题的解决方案,可能重复