【问题标题】:Get caret position when key pressed using KeyboardFocusManager使用 KeyboardFocusManager 按下键时获取插入符号位置
【发布时间】:2017-01-24 10:25:31
【问题描述】:

我正在尝试使用 KeyboardFocusManager 在键入“

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);
            }
        });
    }
}

【问题讨论】:

  • DocumentListener & Caret

标签: java swing jtextarea keyboardfocusmanager


【解决方案1】:

您正在使用通用键事件调度程序。可能的事件是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);
            }
        }
    });

【讨论】:

    【解决方案2】:

    这不是你应该做的,你应该实现一个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”事件。当一个键被释放时产生这个事件 起来。

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2013-05-08
      相关资源
      最近更新 更多