这些Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参阅JDK发行说明。
插入点(光标)在文本组件中移动或者文本组件的选中内容发生变化时,会触发插入点事件。例如,文本组件的文档在插入或删除文本时可以触发插入点事件。你可以使用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的源文件链接。有关程序中插入符监听器方面的讨论,请参见监听插入符和选择更改在文本组件功能中。
因为CaretListener只有一个方法,所以它没有相应的适配器类。
| 方法 | 目的 |
|---|---|
| caretUpdate(CaretEvent) | 在被监听组件中插入符移动或选择更改时调用。 |
| 方法 | 目的 |
|---|---|
| int getDot() | 返回插入符的当前位置。如果有文本被选中,插入符标记选中的一端。 |
| int getMark() | 返回选中的另一端。如果没有选中任何文本,该方法返回的值与getDot返回的值相等。请注意,插入符不保证小于选中的另一端。 |
| Object getSource() (在 java.util.EventObject中) |
返回触发事件的对象。 |
以下表格列出了使用Caret监听器的示例。
| 示例 | 描述位置 | 注释 |
|---|---|---|
TextComponentDemo |
监听Caret和选择更改 | 使用监听器标签来显示插入符和选择状态。 |