您可以使用:
KeyStroke space = KeyStroke.getKeyStroke("pressed SPACE");
InputMap im = comboBox.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.getParent().remove(space);
此解决方案的问题在于它删除了应用程序中所有组合框的弹出功能,这可能是也可能不是您想要的。
编辑:
如果这是针对单个组合框,则需要更多的工作。您需要调用comboBox.selectWithKeyChar()方法。使用自定义操作很容易做到这一点。不幸的是,这仍然不起作用,因为此代码最终调用了DefaultKeySelectionManager,这取决于 BasicComboBoxUI 类中包含的一些类变量。因此,我最终编写了自己的 ow KeySelectionManager,它将所有这些变量保持在本地。这就是我想出的:
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 );
Action search = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
comboBox.selectWithKeyChar( " ".charAt(0) );
}
};
KeyStroke space = KeyStroke.getKeyStroke("typed SPACE");
comboBox.getActionMap().put("spacePopup", search);
comboBox.setKeySelectionManager( new MyKeySelectionManager(comboBox) );
}
static class MyKeySelectionManager implements JComboBox.KeySelectionManager
{
private JComboBox comboBox;
private JList listBox;
private boolean useComboBoxModel;
private long timeFactor;
private long lastTime;
private long time;
private String prefix = "";
private String typedString = "";
public MyKeySelectionManager(JComboBox comboBox)
{
this.comboBox = comboBox;
Long l = (Long)UIManager.get("ComboBox.timeFactor");
timeFactor = l == null ? 1000L : l.longValue();
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)
{
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();
}
});
}
}