使用KeyboardFocusManager按键时获取插入位置

时间:2016-09-16 08:49:06

标签: java swing jtextarea keyboardfocusmanager

当"<"时,我试图获得当前的插入位置。使用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);
            }
        });
    }
}

2 个答案:

答案 0 :(得分:0)

您正在使用一般的关键事件调度程序。可能的事件是KEY_PRESSEDKEY_TYPEDKEY_RELEASED。根据您的说法,您需要KEY_TYPED。所以过滤:

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

答案 1 :(得分:0)

这不是你应该怎么做的,你应该实现KeyListener并使用addKeyListener(KeyListener)将其添加到JTextArea,如下所示:

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”事件。允许按键时会生成此事件   起来。