Java 什么时候是法定呼叫getMagicCaretPosition()

Java 什么时候是法定呼叫getMagicCaretPosition(),java,swing,autocomplete,jtextpane,caret,Java,Swing,Autocomplete,Jtextpane,Caret,我正在开发一个自动完成功能(包含在插入符号位置下的一个小窗口中,提示您将要编写的内容),扩展JTextPane,并在与此组件关联的KeyAdapter中编写了以下内容: ... @Override public void keyReleased(KeyEvent e) { if (Character.isLetterOrDigit(e.getKeyChar())) { p = getCaret().getMagicCaretPosition(); if (

我正在开发一个自动完成功能(包含在插入符号位置下的一个小窗口中,提示您将要编写的内容),扩展
JTextPane
,并在与此组件关联的
KeyAdapter
中编写了以下内容:

...
@Override
public void keyReleased(KeyEvent e) {
    if (Character.isLetterOrDigit(e.getKeyChar())) {
        p = getCaret().getMagicCaretPosition();
        if (p != null) {
            SwingUtilities.convertPointToScreen(p, this);
            p.x = p.x + 2;
            p.y = p.y + 20;
            autocompletion.setLocation(p.x, p.y);
        }
    }
}
...
问题是有时
getCaret().getMagicCaretPosition()
返回null,我不明白为什么

调用此方法或实现此功能的合法方式是什么?

1)我希望(小窗口)==
JWindow
不要忘记声明

2) 然后你可以使用两种选择

  • JTable
    只有一列,实现起来非常简单,不需要解决您描述的任何问题,只实现了从simple
    JTextField

  • JList
    with

3)
keylister
不是正确的监听器查看
Document/DocumentListener


4) 最简单、最舒适的方法是实现一个
JTable
,使用这并不能回答您的问题,但您已经看过了。它可能包含一些有用的提示,我已经看过了,但它对我没有帮助,因为在sun的教程中,自动完成功能是以完全不同的方式实现的(没有另一个框架)。sun的教程使用SwingUtilities.invokeLater()。这在这里可能也有帮助,因为它应该有助于确保文档在您进行处理之前已完全更新。感谢提供2,3,4。关于1,实际上我正在使用一个未修饰且不可聚焦的
JFrame
,你认为这不是一个好的选择吗?不是那个错误的想法,把未修饰的JDialog放在那里,然后toFront在所有情况下都能工作,顺便说一句,管理两个JFrame有很多问题,从焦点开始,toFront。。。。