当"<"时,我试图获得当前的插入位置。使用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);
}
});
}
}
答案 0 :(得分:0)
您正在使用一般的关键事件调度程序。可能的事件是KEY_PRESSED
,KEY_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);
}
}
});
答案 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
”事件。允许按键时会生成此事件 起来。