- 所有已实现的接口:
-
FocusListener
,MouseListener
,MouseMotionListener
,Shape
,Serializable
,Cloneable
,EventListener
,Caret
- 直接已知的子类:
-
BasicTextUI.BasicCaret
此实现期望两个异步通知源。计时器线程会异步触发,导致插入符号简单地重绘最近的边界框。插入符号还会跟踪文档修改时的变化。通常,这将在事件分发线程上发生,因为某些鼠标或键盘事件的结果。插入符号在同步和异步文档更新上的行为由UpdatePolicy属性控制。新插入符号位置的重绘将在任何情况下在事件线程上发生,因为对modelToView的调用仅在事件线程上是安全的。
插入符号在安装的文本组件上充当鼠标和焦点监听器,并根据这些事件定义插入符号语义。监听器方法可以重新实现以更改语义。默认情况下,第一个鼠标按钮将用于设置焦点和插入符号位置。拖动第一个鼠标按钮的鼠标指针将在模型中连续选择。如果关联的文本组件是可编辑的,则在获得焦点时插入符号将变为可见,并在失去焦点时变为不可见。
与关联文本组件绑定的Highlighter默认用于呈现选择。选择外观可以通过提供用于高亮显示的绘制器来自定义。默认情况下,将使用一个绘制器,该绘制器将以关联文本组件中的SelectionColor属性指定的实色进行渲染。这可以通过重新实现getSelectionPainter方法轻松更改。
可以通过重新实现paint方法来实现自定义插入符号外观。如果更改了paint方法,则还应重新实现damage方法,以导致需要重新绘制插入符号的区域。插入符号扩展了Rectangle类,用于保存插入符号上次呈现的边界框。这使得插入符号在移动时可以以线程安全的方式重绘,而无需调用modelToView,因为modelToView在模型更新和视图修复之间是不稳定的(即DocumentListeners的传递顺序不能保证)。
当插入符号位置更改时,魔术插入符号位置设置为null。计时器用于确定新位置(在插入符号更改后)。当计时器触发时,如果魔术插入符号位置仍为null,则将其重置为当前插入符号位置。任何更改插入符号位置并希望魔术插入符号位置保持不变的操作,必须记住魔术插入符号位置,更改光标,然后将魔术插入符号位置设置为其原始值。这有一个好处,即只有希望魔术插入符号位置保持不变的操作(例如打开/向下)需要知道它。
警告: 该类的序列化对象将不兼容未来的Swing版本。当前的序列化支持适用于短期存储或在运行相同Swing版本的应用程序之间的RMI。从1.4开始,已将所有JavaBeans的长期存储支持添加到java.beans包中。请参阅XMLEncoder
。
- 参见:
-
Nested Class Summary
Nested classes/interfaces declared in class java.awt.geom.Rectangle2D
Rectangle2D.Double, Rectangle2D.Float
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
表示插入符号位置始终应根据文档更改进行更新,无论文档更新是在事件分发线程上执行还是不执行。protected ChangeEvent
模型的更改事件。protected EventListenerList
事件监听器列表。static final int
表示插入符号应始终保持在文档中的相同绝对位置,而不考虑任何文档更新,除非由于删除导致文档长度小于当前插入符号位置。static final int
表示插入符号位置仅在事件分发线程上执行文档更改时才会更新。Fields declared in class java.awt.geom.Rectangle2D
OUT_BOTTOM, OUT_LEFT, OUT_RIGHT, OUT_TOP
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
添加侦听器以跟踪插入符号位置何时更改。protected void
adjustVisibility
(Rectangle nloc) 滚动关联视图(如果需要)以使插入符号可见。protected void
损坏插入符号周围的区域,以导致其在新位置重绘。void
当UI从JTextComponent的接口中移除时调用。boolean
将此对象与指定对象进行比较。protected void
通知所有已注册对此事件类型感兴趣的所有侦听器。void
当包含插入符号的组件获得焦点时调用。void
当包含插入符号的组件失去焦点时调用。int
获取插入符号闪烁速率。返回在此插入符号上注册的所有更改侦听器的数组。protected final JTextComponent
获取此插入符号绑定到的文本编辑器组件。int
getDot()
获取插入符号的当前位置。返回插入符号位置的偏移。<T extends EventListener>
T[]getListeners
(Class<T> listenerType) 返回当前在此插入符号上注册为FooListener
的所有对象的数组。获取保存的插入符号位置。int
getMark()
获取标记的当前位置。返回标记位置的偏移。protected Highlighter.HighlightPainter
获取Highlighter的绘制器。int
获取文档更新时的插入符号移动策略。void
当UI安装到JTextComponent的接口中时调用。boolean
isActive()
检查插入符号当前是否活动。boolean
检查当前选择是否可见。boolean
指示插入符号当前是否可见。void
当鼠标单击时调用。void
根据鼠标指针当前位置移动插入符号位置。void
当鼠标进入区域时调用。void
当鼠标退出区域时调用。void
当鼠标移动时调用。void
如果按下按钮1,则实现请求关联文本组件的焦点,并设置插入符号位置。void
当鼠标释放时调用。protected void
尝试根据鼠标事件的坐标移动插入符号位置,使用viewToModel()。void
moveDot
(int dot) 将插入符号位置移动到指定位置,带有正向偏移。void
moveDot
(int dot, Position.Bias dotBias) 将插入符号位置移动到指定位置,带有指定的偏移。void
将插入符号呈垂直线状呈现。protected void
尝试根据鼠标事件的坐标设置插入符号位置,使用viewToModel()。void
移除跟踪插入符号位置更改的侦听器。protected final void
repaint()
导致插入符号被绘制。void
setBlinkRate
(int rate) 设置插入符号闪烁速率。void
setDot
(int dot) 将插入符号位置和标记设置为指定位置,带有正向偏移。void
setDot
(int dot, Position.Bias dotBias) 将插入符号位置和标记设置为指定位置,带有指定的偏移。void
保存当前插入符号位置。void
setSelectionVisible
(boolean vis) 更改选择可见性。void
setUpdatePolicy
(int policy) 设置文档更新时的插入符号移动策略。void
setVisible
(boolean e) 设置插入符号可见性,并重绘插入符号。Methods declared in class java.awt.Rectangle
add, add, add, contains, contains, contains, contains, createIntersection, createUnion, getBounds, getBounds2D, getHeight, getLocation, getSize, getWidth, getX, getY, grow, inside, intersection, intersects, isEmpty, move, outcode, reshape, resize, setBounds, setBounds, setLocation, setLocation, setRect, setSize, setSize, toString, translate, union
Methods declared in class java.awt.geom.Rectangle2D
add, add, add, contains, contains, getPathIterator, getPathIterator, hashCode, intersect, intersects, intersectsLine, intersectsLine, outcode, setFrame, setRect, union
Methods declared in class java.awt.geom.RectangularShape
clone, contains, contains, getCenterX, getCenterY, getFrame, getMaxX, getMaxY, getMinX, getMinY, intersects, setFrame, setFrame, setFrameFromCenter, setFrameFromCenter, setFrameFromDiagonal, setFrameFromDiagonal
Methods declared in interface java.awt.Shape
contains, contains, contains, contains, getPathIterator, getPathIterator, intersects, intersects
-
Field Details
-
UPDATE_WHEN_ON_EDT
public static final int UPDATE_WHEN_ON_EDT表示插入符号位置仅在事件分发线程上执行文档更改时才会更新。- 自1.5版本起:
- 1.5
- 参见:
-
NEVER_UPDATE
public static final int NEVER_UPDATE表示插入符号位置应始终保持在文档中的相同绝对位置,而不考虑任何文档更新,除非由于删除导致文档长度小于当前插入符号位置。在这种情况下,插入符号位置将调整为文档的末尾。- 自1.5版本起:
- 1.5
- 参见:
-
ALWAYS_UPDATE
public static final int ALWAYS_UPDATE表示插入符号位置始终应根据文档更改进行更新,无论文档更新是在事件分发线程上执行还是不执行。- 自1.5版本起:
- 1.5
- 参见:
-
listenerList
事件监听器列表。 -
changeEvent
模型的更改事件。每个模型实例只需要一个ChangeEvent,因为事件的唯一(只读)状态是源属性。此处生成的事件的源始终为“this”。
-
-
Constructor Details
-
DefaultCaret
public DefaultCaret()构造默认插入符号。
-
-
Method Details
-
setUpdatePolicy
public void setUpdatePolicy(int policy) 设置文档更新时插入符号的移动策略。通常,插入符号在插入发生在插入符号位置之前或在插入符号位置时会更新其在文档中的绝对位置,并在插入符号位置之前发生删除时也会更新。这里的“绝对位置”是指相对于文档开头的位置。例如,如果在可编辑文本组件中键入字符,则该字符将插入到插入符号位置,并由于插入而插入符号移动到文档中的下一个绝对位置,如果键入BACKSPACE
,则由于删除插入符号之前的字符,插入符号会减少其绝对位置。有时,关闭插入符号位置更新可能是有用的,这样插入符号将保持在文档中的相同绝对位置,而不考虑任何文档更新。允许以下更新策略:
NEVER_UPDATE
:插入符号保持在文档中的相同绝对位置,而不考虑任何文档更新,除非文档长度由于删除而变得小于当前插入符号位置。在这种情况下,插入符号位置将调整为文档的末尾。当使用此策略时,插入符号不会尝试通过滚动关联视图来保持自身可见。ALWAYS_UPDATE
:插入符号始终跟踪文档更改。对于常规更改,如果在当前位置之前或在其当前位置发生插入,则它会增加其位置,并且如果在其当前位置之前发生删除,则会减少位置。对于撤消/重做更新,它始终移动到更新发生的位置。插入符号还会尝试通过调用adjustVisibility
方法来保持自身可见。UPDATE_WHEN_ON_EDT
:如果文档更新在事件分派线程上执行,则表现类似于ALWAYS_UPDATE
,如果在其他线程上执行更新,则表现类似于NEVER_UPDATE
。
默认属性值为
UPDATE_WHEN_ON_EDT
。- 参数:
-
policy
- 以下值之一:UPDATE_WHEN_ON_EDT
、NEVER_UPDATE
、ALWAYS_UPDATE
- 抛出:
-
IllegalArgumentException
- 如果传递了无效值 - 自:
- 1.5
- 参见:
-
getUpdatePolicy
public int getUpdatePolicy()获取文档更新时插入符号的移动策略。- 返回:
-
以下值之一:
UPDATE_WHEN_ON_EDT
、NEVER_UPDATE
、ALWAYS_UPDATE
- 自:
- 1.5
- 参见:
-
getComponent
获取此插入符号绑定到的文本编辑器组件。- 返回:
- 组件
-
repaint
protected final void repaint()使插入符号被绘制。重绘区域是插入符号的边界框(即插入符号矩形或this)。此方法是线程安全的,尽管大多数Swing方法不是。有关更多信息,请参阅Swing中的并发性。
-
damage
损坏插入符号周围的区域,使其在新位置重新绘制。如果重新实现了paint()方法,则还应重新实现此方法。此方法应更新插入符号边界(x、y、宽度和高度)。- 参数:
-
r
- 插入符号的当前位置 - 参见:
-
adjustVisibility
滚动关联视图(如果需要)以使插入符号可见。由于应该如何执行此操作在某种程度上是一种策略,因此可以重新实现此方法以更改行为。默认情况下,会在关联组件上调用scrollRectToVisible方法。- 参数:
-
nloc
- 要滚动到的新位置
-
getSelectionPainter
获取高亮器的绘制器。- 返回:
- 绘制器
-
positionCaret
尝试根据鼠标事件的坐标从视图到模型(viewToModel())设置插入符号的位置。- 参数:
-
e
- 鼠标事件
-
moveCaret
尝试根据鼠标事件的坐标从视图到模型(viewToModel())移动插入符号的位置。如果点和标记不同,这将导致选择。- 参数:
-
e
- 鼠标事件
-
focusGained
当包含插入符号的组件获得焦点时调用。这是为了在组件可编辑时将插入符号设置为可见。- 指定者:
-
focusGained
在接口FocusListener
中实现 - 参数:
-
e
- 焦点事件 - 参见:
-
focusLost
当包含插入符号的组件失去焦点时调用。这是为了将插入符号设置为不可见。- 指定者:
-
focusLost
在接口FocusListener
中实现 - 参数:
-
e
- 焦点事件 - 参见:
-
mouseClicked
当鼠标被单击时调用。如果单击是由button1生成的,双击选择一个单词,三次单击选择当前行。- 指定者:
-
mouseClicked
在接口MouseListener
中实现 - 参数:
-
e
- 鼠标事件 - 参见:
-
mousePressed
如果按下按钮1,则实现此方法以请求关联文本组件的焦点,并设置插入符号位置。如果按住Shift键,则插入符号将被移动,可能导致选择,否则插入符号位置将设置为新位置。如果组件未启用,则不会请求焦点。- 指定者:
-
mousePressed
在接口MouseListener
中实现 - 参数:
-
e
- 鼠标事件 - 参见:
-
mouseReleased
当鼠标释放时调用。- 指定者:
-
mouseReleased
在接口MouseListener
中实现 - 参数:
-
e
- 鼠标事件 - 参见:
-
mouseEntered
当鼠标进入区域时调用。- 指定者:
-
mouseEntered
在接口MouseListener
中实现 - 参数:
-
e
- 鼠标事件 - 参见:
-
mouseExited
当鼠标退出区域时调用。- 指定者:
-
mouseExited
在接口MouseListener
中实现 - 参数:
-
e
- 鼠标事件 - 参见:
-
mouseDragged
根据鼠标指针当前位置移动插入符号位置。这实际上扩展了选择。默认情况下,仅对鼠标按钮1执行此操作。- 指定者:
-
mouseDragged
在接口MouseMotionListener
中 - 参数:
-
e
- 鼠标事件 - 参见:
-
mouseMoved
当鼠标移动时调用。- 指定者:
-
mouseMoved
在接口MouseMotionListener
中 - 参数:
-
e
- 鼠标事件 - 参见:
-
paint
将插入符呈现为垂直线。如果重新实现此方法,damage方法也应重新实现,因为它假定插入符的形状是垂直线。将插入符颜色设置为getCaretColor()返回的值。如果关联文档中存在多个文本方向,则将呈现指示插入符偏移的标志。只有在关联文档是AbstractDocument的子类且双向元素结构中存在多个双向级别(即文本具有多个与之关联的方向)时才会发生这种情况。
-
install
当UI安装到JTextComponent的接口中时调用。这可用于访问由此接口的实现导航的模型。将dot和mark设置为0,并建立文档、属性更改、焦点、鼠标和鼠标移动侦听器。 -
deinstall
当UI从JTextComponent的接口中移除时调用。用于注销附加的任何侦听器。 -
addChangeListener
添加侦听器以跟踪插入符位置的更改。- 指定者:
-
addChangeListener
在接口Caret
中 - 参数:
-
l
- 侦听器 - 参见:
-
removeChangeListener
移除跟踪插入符位置更改的侦听器。- 指定者:
-
removeChangeListener
在接口Caret
中 - 参数:
-
l
- 侦听器 - 参见:
-
getChangeListeners
返回在此插入符上注册的所有更改侦听器的数组。- 返回:
-
所有此插入符的
ChangeListener
或如果当前未注册任何更改侦听器,则返回空数组 - 自:
- 1.4
- 参见:
-
fireStateChanged
protected void fireStateChanged()通知所有已注册对此事件类型感兴趣的侦听器。事件实例是使用传递给fire方法的参数延迟创建的。侦听器列表按照从后到前的顺序处理。- 参见:
-
getListeners
返回当前在此插入符上注册为FooListener
的所有对象的数组。FooListener
是使用addFooListener
方法注册的。您可以使用类字面量(例如
FooListener.class
)指定listenerType
参数。例如,您可以使用以下代码查询DefaultCaret
c
的更改侦听器:ChangeListener[] cls = (ChangeListener[])(c.getListeners(ChangeListener.class));
如果不存在此类侦听器,则此方法返回一个空数组。- 类型参数:
-
T
- 侦听器类型 - 参数:
-
listenerType
- 请求的侦听器类型 - 返回:
-
在此组件上注册为
FooListener
的所有对象的数组,如果尚未添加此类侦听器,则返回一个空数组 - 抛出:
-
ClassCastException
- 如果listenerType
未指定实现java.util.EventListener
的类或接口 - 自:
- 1.3
- 参见:
-
setSelectionVisible
public void setSelectionVisible(boolean vis) 更改选择可见性。- 指定者:
-
setSelectionVisible
在接口Caret
中 - 参数:
-
vis
- 新的可见性
-
isSelectionVisible
public boolean isSelectionVisible()检查当前选择是否可见。- 指定者:
-
isSelectionVisible
在接口Caret
中 - 返回:
- 如果选择可见,则为true
-
isActive
public boolean isActive()确定插入符当前是否活动。此方法返回插入符当前是否处于闪烁状态。它不提供有关插入符当前是打开还是关闭的信息。要确定插入符当前是否已绘制,请使用
isVisible
方法。- 返回:
-
如果活动则为
true
,否则为false
- 自:
- 1.5
- 参见:
-
isVisible
public boolean isVisible()指示插入符当前是否可见。随着插入符的闪烁,此方法的返回值将在插入符绘制时为true,在插入符不绘制时为false。isActive
指示插入符当前是否处于闪烁状态,即它可以可见,而isVisible
指示插入符实际上是否可见。希望渲染不同闪烁插入符的子类应重写paint方法,并仅在此方法返回true时绘制插入符。
-
setVisible
public void setVisible(boolean e) 设置插入符可见性,并重绘插入符。重要的是要理解此方法、isVisible
和isActive
之间的关系。调用此方法并传入true
会激活插入符闪烁。将其设置为false
会完全关闭插入符。要确定闪烁是否激活,应调用isActive
。实际上,isActive
是此方法的适当对应的“getter”方法。可以使用isVisible
获取插入符的当前可见性状态,即插入符当前是否已绘制。此状态将随着插入符的闪烁而改变。以下是在调用此方法后
isActive
和isVisible
的潜在返回值列表:setVisible(true)
:- isActive(): true
- isVisible(): true或false,取决于插入符是打开还是关闭
setVisible(false)
:- isActive(): false
- isVisible(): false
- 指定者:
-
setVisible
在接口Caret
中 - 参数:
-
e
- 可见性规定者 - 参见:
-
setBlinkRate
public void setBlinkRate(int rate) 设置插入符号的闪烁速率。- 指定者:
-
setBlinkRate
在接口Caret
中 - 参数:
-
rate
- 以毫秒为单位的速率,0表示停止闪烁 - 参见:
-
getBlinkRate
public int getBlinkRate()获取插入符号的闪烁速率。- 指定者:
-
getBlinkRate
在接口Caret
中 - 返回:
- 以毫秒为单位的延迟。如果为零,则插入符号不会闪烁。
- 参见:
-
getDot
public int getDot()获取插入符号的当前位置。 -
getMark
public int getMark()获取标记的当前位置。如果存在选择,则插入符号和标记将不相同。 -
setDot
public void setDot(int dot) 将插入符号位置和标记设置为指定位置,并具有正向偏差。这隐式地将选择范围设置为零。 -
moveDot
public void moveDot(int dot) 将插入符号位置移动到指定位置,并具有正向偏差。 -
moveDot
将插入符号位置移动到指定位置,并具有指定的偏差。- 参数:
-
dot
- 位置 >= 0 -
dotBias
- 此位置的偏差,非null
- 抛出:
-
IllegalArgumentException
- 如果偏差为null
- 自:
- 1.6
- 参见:
-
setDot
将插入符号位置和标记设置为指定位置,并具有指定的偏差。这隐式地将选择范围设置为零。- 参数:
-
dot
- 位置 >= 0 -
dotBias
- 此位置的偏差,非null
- 抛出:
-
IllegalArgumentException
- 如果偏差为null
- 自:
- 1.6
- 参见:
-
getDotBias
返回插入符号位置的偏差。- 返回:
- 插入符号位置的偏差
- 自:
- 1.6
-
getMarkBias
返回标记的偏差。- 返回:
- 标记的偏差
- 自:
- 1.6
-
setMagicCaretPosition
保存当前插入符号位置。在发生插入符号上/下操作时使用,移动到具有不同结束位置的行之间。- 指定者:
-
setMagicCaretPosition
在接口Caret
中 - 参数:
-
p
- 位置 - 参见:
-
getMagicCaretPosition
获取保存的插入符号位置。- 指定者:
-
getMagicCaretPosition
在接口Caret
中 - 返回:
- 位置见 #setMagicCaretPosition
- 参见:
-
equals
将此对象与指定对象进行比较。不希望比较矩形的超类行为,因此更改为Object行为。
-