使用多字元素搜索JComboBoxes

例如,假设我有一个带有元素{“example 1”,“example 2”,“example 3”}的JComboBox (请注意示例和相应数字之间的空格)。

当您在选择combobox时尝试通过键入搜索“示例2”时,它会关闭,因为空格键会切换组件的弹出窗口。

这可以分为两个问题:

  1. 我做了一个swing事件,到目前为止它识别出空格键,我已经禁用了JComboBox的默认空格键动作。 如何制作它以便按空格键实际上会使其添加到搜索中?
  2. 如果#1不可能或未知,还有什么方法可以做到这一点?

任何能够正确回答这个问题的人都绝对会收到一个upvote。

您可以使用:

 KeyStroke space = KeyStroke.getKeyStroke("pressed SPACE"); InputMap im = comboBox.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); im.getParent().remove(space); 

此解决方案的问题在于它会删除应用程序中所有combobox的弹出function,这可能是您想要的,也可能不是。

编辑:

如果这是一个combobox,则需要更多工作。 您需要调用comboBox.selectWithKeyChar()方法。 这很容易与自定义Action一起使用。 不幸的是,这仍然不起作用,因为此代码最终调用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 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( 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(); } }); } } 

你可以捕获keypressed事件,只需在所需的字符串中附加“”。