0

OK、また行きます。スティーブは、別の非標準のキーストロークのセットをプログラムする必要があります。編集可能なJTextPaneがJScrollPaneに埋め込まれています。このペインは上矢印キーと下矢印キーを正しく処理しますが、その方法がわかりません。方法がわかれば、実装する必要のある非標準的なものを実装できます。

具体的には、PageDownキーは別の機能を実行するようにグローバルにマップされているため、PageUp、PageDown、Ctrl-PageUp、およびCtrl-PageDownのデフォルトのアクションは実行しません。代わりに、これらの関数を、テンキーの関数ではなく、シフトされた矢印キーにマップします。

具体的には、JScrollPaneクラスの祖先入力マップ((InputMap)UIManager.get( "ScrollPane.ancestorInputMap");)に追加します。

  • 「scrollDown」アクションを指すAncestor入力マップに下向き矢印キーをシフト
  • 「scrollUp」アクションを指すAncestor入力マップへのシフトアップ矢印キー
  • 「scrollHome」アクションを指すAncestor入力マップに左矢印キーをシフト
  • 「scrollEnd」アクションを指すAncestor入力マップに右矢印キーをシフト

これらのキーストロークはどれも何もしません。JComponentのprocessKeyEvent()メソッドとprocessKeyBinding()メソッドをオーバーライドして、何が起こっているかをログに記録しましたが、これらのメソッドがこれらのキーストロークによって起動されることはありません。また、これらのキーストロークは機能しますが、プレーンな標準の上矢印および下矢印キーストロークはこれらのメソッドを起動しません。

したがって、他の何かがこれらのキーストロークを処理していることは明らかです。しかし、それはどのような要素ですか?そして、はい、私がこれを試しているとき、テキストペインには焦点があります。

4

3 に答える 3

2
  • スティーブの参照バージョン:-)

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

  • DU もこのフォーラムが大好きです。

  • SSCCE は、第 2 側のボランティアのためにあらゆる扉を開くことができました。ではない

于 2012-09-19T21:37:20.823 に答える
1

mKorbelが正しく表示しているように、「ページアップ」と「ページダウン」のアクションがあります(3番目の画面を参照)。したがって、ActionMapを使用して、アクションを自分のものに置き換えてください。

于 2012-09-20T06:12:55.000 に答える
1

OK、トラッシュゴッドは基本的に正しかった。解決策は、アクションに KeyBindings 名を使用することでした。正しい答えを見つけるのが遅れたのは、別の場所でマッピングを元に戻していたコードの迷いが原因でした。

より具体的には、JTextPane でデフォルトのキーストロークを無効にしてから、それらをスクロール ペインの入力マップに追加し、新しいアクションにマップします。

TextPane コンストラクター内

...
        disableAction("caret-down"); // down arrow
        disableAction("caret-up");   // up arrow
        disableAction("selection-backward"); // shift-left-arrow
        disableAction("selection-forward");  // shift-right-arrow
        disableAction("selection-up");  //shift-up-arrow
        disableAction("selection-down"); // shift-down-arrow

    }

    private void disableAction(String name) {
        Action a = getActionMap().get(name);
        if (a != null) {
            a.setEnabled(false);
        }
    }

ScrollPane で

import static javax.swing.KeyStroke.getKeyStroke;
import static java.awt.event.KeyEvent.*;
...
    private void remapShiftedArrowKeys() {
        InputMap map = (InputMap)UIManager.get("ScrollPane.ancestorInputMap");
        map.put(getKeyStroke(VK_DOWN, SHIFT_DOWN_MASK), "scrollDown");
        map.put(getKeyStroke(VK_UP, SHIFT_DOWN_MASK), "scrollUp");
        map.put(getKeyStroke(VK_LEFT, SHIFT_DOWN_MASK), "scrollHome");
        map.put(getKeyStroke(VK_RIGHT, SHIFT_DOWN_MASK), "scrollEnd");
    }

JScrollPane はすでにこれらのキーで必要なことを行っているため、シフトされた Up および Down キーをマップする必要がないことに注意してください。それらを JTextPane からアンマップするだけで十分です。これらの他の 4 つのキーストロークは完全に非標準であり、スクロール ペインでも再マッピングする必要があります。

ご助力いただきありがとうございます!

ああ、実際の答えは、もちろん JTextPane が通常これらの矢印キーを処理するということです。やりたいことをやるには、それを無効にして、スクロール ペインで適切にマッピングする必要がありました。

于 2012-09-20T21:42:16.720 に答える