Java 检测文本控件中的插入符号移动

Java 检测文本控件中的插入符号移动,java,swt,listener,caret,Java,Swt,Listener,Caret,我觉得自己很愚蠢,但当用户在文本或样式文本输入字段中更改插入符号时,我似乎无法通知听众。我尝试了SelectionListener以及CaretListener(仅限于StyledText),但当我使用箭头键在多行输入字段中移动插入符号时,没有一个被可靠调用。CaretListener有时会被调用,但是,例如,在您选择所有文本并点击Del收听SWT.MouseUp和SWT.KeyUp之后,就不会被调用了: public static void main(String[] args) {

我觉得自己很愚蠢,但当用户在
文本
样式文本
输入字段中更改插入符号时,我似乎无法通知听众。我尝试了
SelectionListener
以及
CaretListener
(仅限于StyledText),但当我使用箭头键在多行输入字段中移动插入符号时,没有一个被可靠调用。
CaretListener
有时会被调用,但是,例如,在您选择所有文本并点击
Del
收听
SWT.MouseUp
SWT.KeyUp
之后,就不会被调用了:

public static void main(String[] args)
{
    Display display = new Display();
    Shell shell = new Shell(display);

    shell.setLayout(new FillLayout());

    Text text = new Text(shell, SWT.BORDER);

    Listener listener = new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            System.out.println("Event");
        }
    };

    text.addListener(SWT.KeyUp, listener);
    text.addListener(SWT.MouseUp, listener);

    shell.pack();
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose(); 
}
您可以使用
static
变量跟踪旧插入符号位置,并将其与
侦听器中的当前位置进行比较


另一个非常方便的事件是
SWT.Verify
,它在所包含的文本发生更改时调用。请注意,这不会考虑鼠标的位置变化