Добавление KeyStroke в JCheckBox

Я хочу добавить KeyStrokes в группу CheckBoxes, поэтому, когда пользователь нажимает 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]);
       }

person Ľubomír    schedule 18.01.2013    source источник


Ответы (1)


Проблема в том, что вы зарегистрировали привязки с помощью inputMap флажка типа WHEN_FOCUSED: они будут эффективны только для того конкретного флажка, который сфокусирован в момент нажатия клавиши.

Предполагая, что вы хотите переключать выбранное состояние независимо от focusOwner, альтернативой является регистрация keyBindings с родительским контейнером checkBox и добавление некоторой логики для поиска компонента, для которого предназначено переключаемое состояние выбора:

// 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 может запускать эти действия вместо переключения выбора вручную. Этот подход используется в недавнем потоке

person kleopatra    schedule 22.01.2013