1

我有下面的屏幕: 在此处输入图像描述

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 时,该操作不起作用

4

1 回答 1

1

只要您只对 ENTER 绑定感兴趣,您可以考虑将搜索按钮定义为根窗格的默认按钮:这将自动将组合框上的输入传递给按钮的操作。

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

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

为 JComboBox 这样做有其自身的绊脚石:您必须实现一个使用此类自定义 textField 的自定义 comboBoxEditor。由于编辑器由 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;
    }

}
于 2013-11-11T12:52:29.677 回答