gpt4 book ai didi

java - 将 KeyStroke 添加到 JCheckBox

转载 作者:行者123 更新时间:2023-12-02 07:19:47 27 4
gpt4 key购买 nike

我想将 KeyStrokes 添加到 CheckBox 组中,因此当用户点击 1 时,击键将选择/取消选择第一个 JCheckBox。

我已经编写了这部分代码,但它不起作用,有人可以指出我正确的方向吗?

    for (int i=1;i<11;i++)
{
boxy[i]=new JCheckBox();
boxy[i].getInputMap().put(KeyStroke.getKeyStroke((char) i),("key_"+i));
boxy[i].getActionMap().put(("key_"+i), new AbstractAction() {
public void actionPerformed(ActionEvent e) {
JCheckBox checkBox = (JCheckBox)e.getSource();
checkBox.setSelected(!checkBox.isSelected());
}});
pnlOdpovede.add(boxy[i]);
}

最佳答案

问题是您使用 WHEN_FOCUSED 类型的复选框的 inputMap 注册了绑定(bind):它们仅对按键时聚焦的特定复选框有效。

假设您想要独立于 focusOwner 切换选定状态,另一种方法是将 keyBindings 注册到复选框的父容器,并添加一些逻辑来查找要切换其选择状态的组件:

// a custom action doing the toggle
public static class ToggleSelection extends AbstractAction {

public ToggleSelection(String id) {
putValue(ACTION_COMMAND_KEY, id);
}

@Override
public void actionPerformed(ActionEvent e) {
Container parent = (Container) e.getSource();
AbstractButton child = findButton(parent);
if (child != null) {
child.setSelected(!child.isSelected());
}
}

private AbstractButton findButton(Container parent) {
String childId = (String) getValue(ACTION_COMMAND_KEY);
for (int i = 0; i < parent.getComponentCount(); i++) {
Component child = parent.getComponent(i);
if (child instanceof AbstractButton && childId.equals(child.getName())) {
return (AbstractButton) child;
}
}
return null;
}

}

// register with the checkbox' parent
for (int i=1;i<11;i++) {
String id = "key_" + i;
boxy[i]=new JCheckBox();
boxy[i].setName(id);
pnlOdpovede.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke((char) i), id);
pnlOdpovede.getActionMap().put(id, new ToggleSelection(id));
pnlOdpovede.add(boxy[i]);
}

顺便说一句:假设您的复选框有操作(它们应该:-),ToggleAction 可以触发这些操作,而不是手动切换选择。这个approach is used in a recent thread

关于java - 将 KeyStroke 添加到 JCheckBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14405464/

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