2

ユーザーの必要条件として、JavaFX アプリケーションで ENTER を TAB として実装しています。次のコードを使用して、ペインに存在するすべてのコントロールを識別し、 OnKeyPressedハンドラーを追加しています。

protected EventHandler<KeyEvent> processadorEnterEmCampo = new EventHandler<KeyEvent>() {
    public void handle(final KeyEvent evento) {
        if (evento.getCode() == KeyCode.ENTER) {
            evento.consume();
            ((Node)evento.getSource()).fireEvent(new KeyEvent(evento.getSource(), evento.getTarget(), evento.getEventType(), null, "TAB", KeyCode.TAB, false, false, false, false));
        }
    }
};  

private void adicionarProcessadorEventoEnterPressionado(Node elemento) {
    if(elemento instanceof Pane){
        Pane painel= (Pane) elemento;
        for(Node filho :painel.getChildren()){
            if(filho instanceof TextField || filho instanceof ComboBox || filho instanceof CheckBox
                    || filho instanceof DatePicker || filho instanceof BigDecimalField)
                filho.setOnKeyPressed(processadorEnterEmCampo);
            else if(filho instanceof Button)
                filho.setOnKeyPressed(processadorEnterEmBotao);
            else
                adicionarProcessadorEventoEnterPressionado(filho);
        }
    }
}

上記のコードは、 BigDecimalField とDatePickerを除いて、魔法のように実行されます。ENTER キーを押してもハンドラーのコードが実行されず、SHIFT キーを押したときにのみハンドラーのコードが実行されます。これらのコンポーネントにはすでに ENTER キーを使用する機能があるため、これが発生していると思います。これらのコンポーネントで ENTER キーの押下を処理するにはどうすればよいですか?

4

1 に答える 1

1

setOnKeyPressed を使用する代わりに、addEventFilterを使用しています。

private void adicionarProcessadorEventoEnterPressionado(Node elemento) {
    if(elemento instanceof Pane){
        Pane painel= (Pane) elemento;
        for(Node filho :painel.getChildren()){
            if(filho instanceof TextField || filho instanceof ComboBox || filho instanceof CheckBox
                    || filho instanceof DatePicker || filho instanceof BigDecimalField)
                filho.addEventFilter(KeyEvent.KEY_PRESSED,processadorEnterEmCampo);
            else if(filho instanceof Button)
                filho.setOnKeyPressed(processadorEnterEmBotao);
            else
                adicionarProcessadorEventoEnterPressionado(filho);
        }
    }
}

コンポーネントの実装がハンドラに到達する前にイベントを消費しているのではないかと疑っていたので、 addEventFilter が最善の策でした:

フィルタは、ノードがイベント配信のキャプチャ フェーズ中に指定されたタイプのイベントを受信したときに呼び出されます。

于 2014-03-18T18:06:51.193 に答える