文档

Java™ 教程
隐藏目录
如何编写插入符监听器
路径: 使用Swing创建GUI
课程: 编写事件监听器
章节: 实现常见事件的监听器

如何编写Caret监听器

插入点(光标)在文本组件中移动或者文本组件的选中内容发生变化时,会触发插入点事件。例如,文本组件的文档在插入或删除文本时可以触发插入点事件。你可以使用addCaretListener方法将插入点监听器附加到任何JTextComponent子类的实例上。


注意:更改监听器

这是来自名为TextComponentDemo的应用程序的插入符事件处理代码:

...
//初始化发生的地方
CaretListenerLabel caretListenerLabel =
    new CaretListenerLabel("插入符状态");
...
textPane.addCaretListener(caretListenerLabel);
...
protected class CaretListenerLabel extends JLabel
                                   implements CaretListener
{
    ...
    //可能不是从事件调度线程调用的。
    public void caretUpdate(CaretEvent e) {
        displaySelectionInfo(e.getDot(), e.getMark());
    }

    //此方法可以从任何线程调用。它会调用setText和modelToView方法,这些方法必须在事件调度线程中运行。我们使用
    //invokeLater在事件调度线程中调度代码的执行。
    protected void displaySelectionInfo(final int dot,
                                        final int mark) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                if (dot == mark) {  // 没有选择
                    ...
                }
            });
        }
    }
}

注意: caretUpdate方法不能保证在事件调度线程中调用。要在caretUpdate中使用更新GUI的任何方法,需要特殊处理以确保它们在事件调度线程上执行。您可以通过将代码包装在一个Runnable中,并在该Runnable上调用SwingUtilities.invokeLater来实现这一点。

您可以在使用Swing组件的示例索引中找到TextComponentDemo的源文件链接。有关程序中插入符监听器方面的讨论,请参见监听插入符和选择更改文本组件功能中。

插入符监听器API

插入符监听器接口

因为CaretListener只有一个方法,所以它没有相应的适配器类。

方法 目的
caretUpdate(CaretEvent) 在被监听组件中插入符移动或选择更改时调用。

CaretEvent类

方法 目的
int getDot() 返回插入符的当前位置。如果有文本被选中,插入符标记选中的一端。
int getMark() 返回选中的另一端。如果没有选中任何文本,该方法返回的值与getDot返回的值相等。请注意,插入符不保证小于选中的另一端。
Object getSource()
(java.util.EventObject)
返回触发事件的对象。

使用Caret监听器的示例

以下表格列出了使用Caret监听器的示例。

示例 描述位置 注释
TextComponentDemo 监听Caret和选择更改 使用监听器标签来显示插入符和选择状态。

上一页:如何编写一个动作监听器
下一页:如何编写一个更改监听器