2

KeyboardFocusManager を使用して、「<」文字が入力されたときに現在のキャレット位置を取得しようとしています。以下のコード。文字を入力したときにテキスト フィールドが空の場合、キャレットの位置は 0 であると予想されます。ただし、実際に得られる結果は次のとおりです: 0 0 1。

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;

import javax.swing.*;


public class TextEditor {

    @SuppressWarnings("serial")
    public static class TextClass extends JTextArea {

        static int startpos = 0; 

        public boolean checkKeyTyped (KeyEvent e) {
            String keystr = Character.toString(e.getKeyChar());
            switch (keystr) {
                case "<":
                    startpos = getSelectionStart();
                    System.out.print("   " + startpos);
            }
            return false;
        }
    }       

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLocationRelativeTo(null);
        final JTextArea textArea = new TextClass();
        frame.add(textArea);
        frame.setVisible(true);

        // Add keyboard listener

        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
            public boolean dispatchKeyEvent(KeyEvent e) {
                return ((TextClass) textArea).checkKeyTyped(e);
            }
        });
    }
}
4

2 に答える 2

0

次のように、 a を実装してusingKeyListenerに追加する必要があります。JTextAreaaddKeyListener(KeyListener)

final JTextArea textArea = new TextClass();
...
textArea.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(final KeyEvent e) {
        char key = e.getKeyChar();
        switch (key) {
            case '<':
                System.out.print("   " + textArea.getSelectionStart());
        }
    }

    @Override
    public void keyPressed(final KeyEvent e) {
    }

    @Override
    public void keyReleased(final KeyEvent e) {
    }
});

これまでKeyEvent、キーを入力するたびにトリガーされる各タイプに対してメソッドが呼び出されるため、3 回出力されます。

KEY_TYPED

" key typed" イベント。このイベントは、文字が入力されたときに生成されます。最も単純なケースでは、キーを 1 回押すだけで生成されます。ただし、多くの場合、文字は一連のキー押下によって生成され、キー押下イベントからキー入力イベントへのマッピングは、多対 1 または多対多の場合があります。

KEY_PRESSED

" key pressed" イベント。このイベントは、キーが押されたときに生成されます。

KEY_RELEASED

" key released" イベント。このイベントは、キーが離されたときに生成されます。

于 2016-09-16T09:14:32.940 に答える
0

一般的な Key Event ディスパッチャを使用しています。可能なイベントはKEY_PRESSEDKEY_TYPEDおよびKEY_RELEASEDです。あなたの言うことに基づいて、あなたが必要KEY_TYPEDです。そのため、次のようにフィルタリングします。

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.KEY_TYPED) {
                return ((TextClass) textArea).checkKeyTyped(e);
            }
        }
    });
于 2016-09-16T09:03:02.457 に答える