2013-01-18 72 views
0

我想將KeyStrokes添加到CheckBox組中,因此當用戶擊中1時,將首先選擇/取消選擇按鍵JCheckBox。將KeyStroke添加到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]); 
     } 

回答

2

的問題是,你註冊類型WHEN_FOCUSED的複選框」 InputMap中的綁定:他們將只用於聚焦在的keyPressed的時間特定的複選框是有效的。

假設你想切換選擇的狀態獨立於focusOwner的,另一種是與複選框的父容器註冊鍵綁定,並添加一些邏輯來發現的意思有其選擇狀態切換組件:

// 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]); 
} 

順便說一句:假設你的checkBox有動作(他們應該:-),ToggleAction可以觸發這些動作而不是手動切換選擇。這approach is used in a recent thread