Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JCheckBox不转移焦点的助记符_Java_Swing_Focus_Mnemonics - Fatal编程技术网

Java JCheckBox不转移焦点的助记符

Java JCheckBox不转移焦点的助记符,java,swing,focus,mnemonics,Java,Swing,Focus,Mnemonics,根据标题,是否可以使用助记符键更改JCheckBox选择状态,而不将焦点转移到组件 根据GIF的当前行为。 想要的行为将是“Type”文本字段上的焦点 问题在于以下线路: 这在处理checkbox的键绑定时被隐藏得很深,而且这段代码从来没有被定制过 解决方法是创建自己的类,该类扩展了JCheckBox,并且在处理键绑定时不请求焦点: public class MyCheckBox extends JCheckBox { private boolean requestFocusAllow

根据标题,是否可以使用助记符键更改
JCheckBox
选择状态,而不将焦点转移到组件

根据GIF的当前行为。
想要的行为将是“Type”文本字段上的焦点


问题在于以下线路:

这在处理checkbox的键绑定时被隐藏得很深,而且这段代码从来没有被定制过

解决方法是创建自己的类,该类扩展了
JCheckBox
,并且在处理键绑定时不请求焦点:

public class MyCheckBox extends JCheckBox {

    private boolean requestFocusAllowed = true;

    public MyCheckBox() {
    }

    @Override
    public void requestFocus() {
        if (requestFocusAllowed) {
            super.requestFocus();
        }
    }

    @Override
    protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) {
        requestFocusAllowed = false;
        try {
            return super.processKeyBinding(ks, e, condition, pressed);
        } finally {
            requestFocusAllowed = true;
        }
    }
}

假定助记符注册为密钥绑定,则在

JComponent.WHEN_IN_FOCUSED_WINDOW

请参见
BasicButtonListener#updateMonicBinding


我们可以简单地用自己的绑定操作覆盖键绑定操作

私有类助记符checkbox:JCheckBox(…){
覆盖乐趣设置助记符(助记符:Int){
超级助记符(助记符)
如果(助记符!=0){
重写动作()
}
}
私密的娱乐活动{
val mnemonicMask=UIUtilities.getSystemMnemonicKeyMask()
val altGraphDownMask=InputEvent.ALT\u GRAPH\u DOWN\u MASK
getInputMap(当在聚焦窗口中时)。应用{
//压制
put(击键。getKeyStroke(助记符,助记符掩码),“助记符pressed”)
put(击键。getKeyStroke(助记符、助记符掩码或altGraphDownMask),“助记符pressed”)
//释放
put(KeyStroke.getKeyStroke(助记符,助记符掩码,true),“助记符释放”)
put(击键。getKeyStroke(助记符,助记符掩码或altGraphDownMask,true),“助记符释放”)
}
actionMap.apply{
put(“助记符pressed”,对象:AbstractAction(){
覆盖已执行的操作(事件:ActionEvent){
model.isArmed=true
model.isPressed=true
}
})
put(“助记符释放”,对象:AbstractAction(){
覆盖已执行的操作(事件:ActionEvent){
model.isPressed=false
model.isArmed=false
}
})
}
}
}
为了维护
BasicButtonListener.Actions
中表达的语义,我们已经覆盖了
按下的
释放的
操作,以更改
按钮模型
状态

例如:


使用标准JCheckBox,您只能使用
setFocusable(false)来实现这一点-但您不能再使用tab键选择复选框,然后按空格键切换。@ThomasKläger如果我能截获助记事件就好了。但是我找不到一个way@ThomasKläger顺便说一句,变通方法是可以的。你可以不用助记符。@camickr是否仍然可以用你的策略突出显示ALT上的“假助记符”字母?谢谢!这似乎与camickr在评论中提出的想法相似。我假设助记符被注册为keybinding,那么如果我简单地通过注册一个具有相同密钥组合的新助记符来覆盖它呢?我已经实现了上面提到的内容,请随意给出您的意见。
JComponent.WHEN_IN_FOCUSED_WINDOW