2012-01-25 5 views
2

表のショートカットに問題があります。私はいくつかのキーをカスタマイズする必要があります:削除 - 行を削除し、テーブルを編集可能/編集不可能にするために上/下矢印を押して編集可能から編集不可能にする。透明なPanelの中​​に私のテーブルを置き、Action.Handlerを使ってキーボードイベントを捕まえます。しかし、TextField、TextArea、Comboboxの内部にこのコンポーネントにイベントを伝播したいと思っていました(TextFieldのテキストを削除するためのdeleteキーの無効化とup/downキーではキーボードで開いたComboboxを使用できません)。私はhandleAction()メソッドでtargetパラメータを見ましたが、私は今それをどのように使うべきかはわかりません。また、置き換えずにショートカットを追加する方法を知ることも興味深い。Vaadinでショートカットを使用する際の問題

// adding table inside Panel 
    tablePanel = new Panel(); 
    tablePanel.setStyleName(Panel.STYLE_LIGHT); 

    VerticalLayout tableElementsLayout = new VerticalLayout(); 
    tablePanel.setContent(tableElementsLayout); 

    tablePanel.setSizeFull(); 
    tableElementsLayout.setSizeFull(); 
    vl.addComponent(tablePanel); 
    vl.setExpandRatio(tablePanel, 1.0f); 

    tableElementsLayout.add(table); 

    // --- adding keyboard handler 
    final Action actionDel = new ShortcutAction("Delete", 
      ShortcutAction.KeyCode.DELETE, null); 

    deleteHandler = new Action.Handler() { 

     @Override 
     public void handleAction(Action action, Object sender, Object target) { 
      // I want handle events here when I'm not inside TextField 
     } 

     @Override 
     public Action[] getActions(Object target, Object sender) { 
      return new Action[] { actionDel }; 
     } 
    }; 

    tablePanel.addActionHandler(deleteHandler);   

どのようにすればいいですか?私はこれが最善か、これを実現するための最も美しい方法であるかどうかわからないんだけど、少なくともそれが動作

+0

私はお手伝いしたいと思いますが、私はあなたの問題を完全に理解していませんでした。 Book of Vaadin:https://vaadin.com/book/-/page/advanced.shortcuts.htmlを読んだことがありますか?これは、Vaadin開発の優れたガイドです。 – miq

+0

すぐにお返事ありがとうございます。 本書のこの部分を完全に読んで、私のコードをそれに従って作成しました。私は一般的に問題を説明しようとします。 Panel内にPanelとTextFieldがあるとします。 PanelのDeleteキーを処理するには、Action.Handlerを使用します。このブロックは、TextFieldでシンボルを受信します(したがって、キーボードからシンボルを削除することはできません)。私が理解しているように、Action.Handlerはキー操作を完全に置き換えます。しかし、私はTextFieldとAction.Handlerの両方がキー入力を受け取れるように、置換しないで聞くショートカットを追加したい。 –

答えて

2

textField.addListener(new BlurListener() { 
    @Override 
    public void blur(BlurEvent event) { 
     tablePanel.addActionHandler(deleteHandler); 
    } 
}); 

textField.addListener(new FocusListener() { 
    @Override 
    public void focus(FocusEvent event) { 
     tablePanel.removeActionHandler(deleteHandler); 
    } 
}); 

これらのリスナーは無効にすることで、deleteHandlerの世話をすること毎回ユーザーはフィールドを入力し、ユーザーがフィールドを離れるたびにフィールドを有効にします。

+0

それは問題を解決したようですね、ありがとう。私はこのアプローチを少し変更しました。テーブルが編集可能なモードになっているときにリスナーを削除します。 –

関連する問題