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

您正在使用通用键事件调度程序。可能的事件是KEY_PRESSED和。根据您所说,您需要. 所以过滤:KEY_TYPEDKEY_RELEASEDKEY_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 回答
0

这不是您应该这样做的方式,您应该实现 aKeyListener并将其添加到您的JTextAreausing 中addKeyListener(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) {
    }
});

到目前为止,您将其打印了 3 次,因为KeyEvent每当您键入一个键时,都会为每种触发的类型调用您的方法:

KEY_TYPED

key typed”事件。输入字符时会生成此事件。在最简单的情况下,它是通过单次按键产生的。然而,字符通常是由一系列按键产生的,并且从按键事件到按键类型事件的映射可能是多对一或多对多的。

KEY_PRESSED

key pressed”事件。按下按键时会生成此事件。

KEY_RELEASED

key released”事件。松开按键时会生成此事件。

于 2016-09-16T09:14:32.940 回答