5

JTextAreaがあります。ある組み合わせが呼び出されたときに、ある量のテキストを選択する関数があります。それはきちんと行われます。問題は、テキストが選択されてVK_LEFTが押されたときに、カレットを選択範囲に移動したいということです。KeyListenerは適切に実装されていますが、他の方法でテストしました。問題は、私が次のコードを書くときです:

@Override public void keyPressed( KeyEvent e) {
        if(e.getKeyChar()==KeyEvent.VK_LEFT)
            if(mainarea.getSelectedText()!=null)
                mainarea.setCaretPosition(mainarea.getSelectionStart());
    }

このリスナーのインスタンスをメインエリアに追加し、(私の関数を使用して)テキストを選択し、左矢印キーを押すと、カレットの位置が選択の最後に設定されます...そして最初になりません...何ですか問題?:S

4

1 に答える 1

8

これがコードスニペットです

    Action moveToSelectionStart = new AbstractAction("moveCaret") {

        @Override
        public void actionPerformed(ActionEvent e) {
            int selectionStart = textComponent.getSelectionStart();
            int selectionEnd = textComponent.getSelectionEnd();
            if (selectionStart != selectionEnd) {
                textComponent.setCaretPosition(selectionEnd);
                textComponent.moveCaretPosition(selectionStart);
            }
        }

        public boolean isEnabled() {
            return textComponent.getSelectedText() != null;
        }
    };
    Object actionMapKey = "caret-to-start";
    textComponent.getInputMap().put(KeyStroke.getKeyStroke("LEFT"), actionMapKey);
    textComponent.getActionMap().put(actionMapKey, moveToSelectionStart);

注:矢印キーのように、通常インストールされているキーバインディングを再定義することはお勧めしません。ユーザーは本当にイライラする可能性があります;-)まだバインドされていないものを探す方がよいでしょう。

于 2011-05-10T14:39:42.150 に答える