gpt4 book ai didi

java - JComponent.WHEN_IN_FOCUSED_WINDOW 无法与 JCombobox 一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:53 24 4
gpt4 key购买 nike

我的屏幕如下: enter image description here

public BillSummaryScreen() {
..........
ShortcutKeyUtils.createShortcutKey(this, KeyEvent.VK_ENTER, "enterShortcut", new EnterAction());

}

public static void createShortcutKey(JComponent panel, int keyEventCode, String actionShortcutName, AbstractAction action){
InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(keyEventCode, 0), actionShortcutName);
ActionMap actionMap = panel.getActionMap();
actionMap.put(actionShortcutName, action);
}

private class EnterAction extends AbstractAction{

@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("EnterAction");
}

}

我想按“ENTER”键以便单击搜索按钮。 但是当我将注意力集中到一个组合框(通过鼠标)并按下 ENTER 时,该操作不起作用

最佳答案

只要您只对 ENTER 绑定(bind)感兴趣,您就可以考虑将搜索按钮定义为根 Pane 的默认按钮:这会将组合框中的 Enter 自动传递给按钮的操作。

JButton searchButton = new JButton(searchAction);
frame.getRootPane().setDefaultButton(searchButton);

虽然可以传递任意绑定(bind),但这有点困难,无论是从可用性角度来看(您是否真的希望两个操作都发生,即绑定(bind)到组件窗口绑定(bind)中的操作?)和技术角度。为了解决后者,您基本上需要一个自定义组件来欺骗绑定(bind)机制,使其相信它对 keyStroke 不感兴趣,例如正如下面的 MultiplexingTextField 中所做的那样。

对 JComboBox 这样做有其自己的障碍:您必须实现一个使用此类自定义文本字段的自定义组合框编辑器。由于编辑器由 LAF 控制(并且几乎每个编辑器看起来都不同),因此每个 LAF 都需要一个自定义编辑器(检查源和 c&p :-)。

/**
* A JTextField that allows you to specify an array of KeyStrokes that
* will have their bindings processed regardless of whether or
* not they are registered on the JTextField itself.
*/
public static class MultiplexingTextField extends JTextField {
private KeyStroke[] strokes;
private List<KeyStroke> keys;
MultiplexingTextField(int cols, KeyStroke... strokes) {
super(cols);
this.keys = Arrays.asList(strokes);
}

@Override
protected boolean processKeyBinding(KeyStroke ks, KeyEvent e,
int condition, boolean pressed) {
boolean processed = super.processKeyBinding(ks, e, condition,
pressed);

if (processed && condition != JComponent.WHEN_IN_FOCUSED_WINDOW
&& keys.contains(ks)) {
// Returning false will allow further processing
// of the bindings, eg our parent Containers will get a
// crack at them.
return false;
}
return processed;
}

}

关于java - JComponent.WHEN_IN_FOCUSED_WINDOW 无法与 JCombobox 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com