Java JComponent.WHEN_在_-FOCUSED_窗口中无法使用JCombobox

Java JComponent.WHEN_在_-FOCUSED_窗口中无法使用JCombobox,java,swing,Java,Swing,我的屏幕如下: 我想按“回车”键,点击搜索按钮 P>,只要你对输入绑定感兴趣,你可以考虑将搜索按钮定义为根目录的默认按钮:这将自动将组合框上的输入传递到按钮的动作。 JButton searchButton = new JButton(searchAction); frame.getRootPane().setDefaultButton(searchButton); 虽然可以传递任意绑定,但从可用性角度(您真的希望两个操作都发生吗,即绑定到组件的操作和窗口绑定中的操作?)和技术角度来看,这都

我的屏幕如下:


我想按“回车”键,点击搜索按钮<但是,当我把注意力集中到一个组合框(鼠标),按下输入框时,这个动作就不起作用了

> P>,只要你对输入绑定感兴趣,你可以考虑将搜索按钮定义为根目录的默认按钮:这将自动将组合框上的输入传递到按钮的动作。
JButton searchButton = new JButton(searchAction);
frame.getRootPane().setDefaultButton(searchButton);
虽然可以传递任意绑定,但从可用性角度(您真的希望两个操作都发生吗,即绑定到组件的操作和窗口绑定中的操作?)和技术角度来看,这都有点困难。为了解决后者,您基本上需要一个自定义组件,该组件诱使绑定机制相信它对击键f.i.不感兴趣,正如下面的multiplexingtext字段中所做的那样

对JComboBox这样做有其自身的障碍:您必须实现一个自定义ComboxEditor,它使用这样一个自定义文本字段。由于编辑器由LAF控制(几乎每个编辑器的外观都不同),因此每个LAF都需要一个自定义编辑器(检查源代码和c&p:-)

/**
*一个JTextField,允许您指定
*将处理其绑定,而不管是否
*它们不是在JTextField本身上注册的。
*/
公共静态类MultiplexingTextField扩展了JTextField{
私人按键[]笔划;
私有列表密钥;
MultiplexingTextField(整数列、击键…笔划){
超级(cols);
this.keys=Arrays.asList(笔划);
}
@凌驾
受保护的布尔processKeyBinding(击键ks、KeyEvent e、,
int条件,按布尔键){
布尔处理=super.processKeyBinding(ks,e,条件,
压榨);
if(已处理和条件!=JComponent.WHEN在聚焦窗口中
&&密钥。包含(ks)){
//返回false将允许进一步处理
//的绑定,例如我们的父容器将获得
//痛击他们。
返回false;
}
已处理退货;
}
}

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

JButton searchButton = new JButton(searchAction);
frame.getRootPane().setDefaultButton(searchButton);
虽然可以传递任意绑定,但从可用性角度(您真的希望两个操作都发生吗,即绑定到组件的操作和窗口绑定中的操作?)和技术角度来看,这都有点困难。为了解决后者,您基本上需要一个自定义组件,该组件诱使绑定机制相信它对击键f.i.不感兴趣,正如下面的multiplexingtext字段中所做的那样

对JComboBox这样做有其自身的障碍:您必须实现一个自定义ComboxEditor,它使用这样一个自定义文本字段。由于编辑器由LAF控制(几乎每个编辑器的外观都不同),因此每个LAF都需要一个自定义编辑器(检查源代码和c&p:-)

/**
*一个JTextField,允许您指定
*将处理其绑定,而不管是否
*它们不是在JTextField本身上注册的。
*/
公共静态类MultiplexingTextField扩展了JTextField{
私人按键[]笔划;
私有列表密钥;
MultiplexingTextField(整数列、击键…笔划){
超级(cols);
this.keys=Arrays.asList(笔划);
}
@凌驾
受保护的布尔processKeyBinding(击键ks、KeyEvent e、,
int条件,按布尔键){
布尔处理=super.processKeyBinding(ks,e,条件,
压榨);
if(已处理和条件!=JComponent.WHEN在聚焦窗口中
&&密钥。包含(ks)){
//返回false将允许进一步处理
//的绑定,例如我们的父容器将获得
//痛击他们。
返回false;
}
已处理退货;
}
}

Enter[输入]可能已被combobox@MadProgrammer当然可以,但是我们怎样才能防止呢?因为当我完成选择后关注combobox时,[Enter]仍然被combobox使用。@zerone,你能给我们看一下
EnterAction
Action的代码吗?更新的EnterAction,没什么,我正在测试[Enter]很可能被combobox@MadProgrammer当然可以,但是我们怎样才能防止呢?因为当我完成选择后关注combobox时,[Enter]仍然被combobox包围。@zerone,你能给我们看一下
EnterAction
Action的代码吗?更新的EnterAction,没什么,我正在测试Sage+1但不明白…,也许明天会更好:-)-1但不明白。。。,也许明天会更好:-)
/**
 * 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;
    }

}