2012-08-31 162 views
2

我已經爲JTextArea組件創建了鍵綁定。當被調用時,它會創建一個新的自己的實例並將焦點設置給它。鍵綁定並按住鍵

如果你按住enter鍵(調用鍵綁定),我的程序將開始吐出一堆JTextArea實例。

有沒有辦法強制用戶按下Enter againg來創建一個新的實例?

我是否切換到KeyListeners或者是否有鍵綁定的方式?

回答

2

與按鍵組合來做到這一點是有兩個動作:

  • 創建組件的動作綁定到按下的輸入,它在插入組件時禁用自身
  • 一個動作使得動作再次被綁定到發佈進入

一些代碼:

// the action to create the component 
public static class CreateAction extends AbstractAction { 

    private Container parent; 
    private Action enableAction; 

    public CreateAction(Container parent) { 
     this.parent = parent; 
     enableAction = new EnableAction(this); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     setEnabled(false); 
     Component field = createTextField(); 
     parent.add(field); 
     parent.revalidate(); 
     field.requestFocus(); 
    } 

    int count; 
    private Component createTextField() { 
     // just for fun counting the fields we create 
     JTextField field = new JTextField("field: " + count++, 20); 
     field.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), 
       "createComponent"); 
     field.getActionMap().put("createComponent", this); 
     field.getInputMap().put(KeyStroke.getKeyStroke("released ENTER"), 
       "enableCreation"); 
     field.getActionMap().put("enableCreation", enableAction); 
     return field; 
    } 

} 

// the action that enables another 
public static class EnableAction extends AbstractAction { 

    Action toEnable; 

    public EnableAction(Action toEnable) { 
     this.toEnable = toEnable; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     toEnable.setEnabled(true); 
    } 

} 

// usage 
final JComponent parent = new JPanel(new MigLayout("wrap")); 
// here I'm lazy and let the action create the very first component as well 
add.actionPerformed(null); 
add.setEnabled(true); 

注意,動作相同實例被註冊到所有組件,因此它並不重要的具有焦點(並最終再次使創建)