模块 java.desktop

类 DefaultCaret

所有已实现的接口:
FocusListener , MouseListener , MouseMotionListener , Shape , Serializable , Cloneable , EventListener , Caret
已知子类:
BasicTextUI.BasicCaret

public class DefaultCaret extends Rectangle implements Caret , FocusListener , MouseListener , MouseMotionListener
Caret 的默认实现。插入符号呈现为垂直线,其颜色由关联的 JTextComponent 的 CaretColor 属性指定。它可以按 BlinkRate 属性指定的速率闪烁。

此实现需要两个异步通知源。计时器线程异步触发,并导致插入符号简单地重新绘制最近的边界框。插入符号还跟踪文档修改时的变化。通常,由于某些鼠标或键盘事件,这将发生在事件分派线程上。同步和异步文档更新的插入符行为由 UpdatePolicy 属性控制。在任何情况下,新插入位置的重绘都将发生在事件线程上,因为对 modelToView 的调用仅在事件线程上是安全的。

插入符号充当鼠标并关注安装它的文本组件上的监听,并根据这些事件定义插入符号语义。可以重新实现监听方法以更改语义。默认情况下,第一个鼠标按钮将用于设置焦点和插入符号位置。用第一个鼠标按钮拖动鼠标指针将扫出模型中连续的选择。如果关联的文本组件是可编辑的,则插入符号将在获得焦点时变为可见,而在失去焦点时不可见。

绑定到关联文本组件的荧光笔默认用于呈现选择。可以通过提供用于高光的绘制器来定制选择外观。默认情况下,使用一个 painter 来呈现 SelectionColor 属性中关联文本组件中指定的纯色。这可以通过重新实现 getSelectionPainter 方法轻松更改。

可以通过重新实现 paint 方法来实现定制的插入符外观。如果更改了绘制方法,则还应重新实现损坏方法以重新绘制渲染插入符所需的区域。插入符号扩展了 Rectangle 类,该类用于保存插入符号最后呈现位置的边界框。这使插入符号能够在插入符号移动时以线程安全的方式重新绘制,而无需调用模型更新和视图修复之间不稳定的 modelToView(即无法保证交付到 DocumentListeners 的顺序)。

当插入符号位置改变时,魔法插入符号位置设置为空。计时器用于确定新位置(在插入符号更改之后)。当计时器触发时,如果魔法插入符位置仍然为空,它将重置为当前插入符位置。任何更改插入符号位置并希望魔法插入符号位置保持不变的操作,必须记住魔法插入符号位置,更改光标,然后将魔法插入符号位置设置为其原始值。这样做的好处是只有希望魔术插入位置持续存在的操作(例如打开/向下)才需要知道它。

Warning: 此类的序列化对象将与未来的 Swing 版本不兼容。当前的序列化支持适用于运行相同版本 Swing 的应用程序之间的短期存储或 RMI。从 1.4 开始,对所有 JavaBeans 的长期存储的支持已添加到 java.beans 包中。请参阅 XMLEncoder

参见:
  • 字段详细信息

    • UPDATE_WHEN_ON_EDT

      public static final int UPDATE_WHEN_ON_EDT
      指示仅当在事件调度线程上执行文档更改时才更新插入符号位置。
      自从:
      1.5
      参见:
    • NEVER_UPDATE

      public static final int NEVER_UPDATE
      表示无论任何文档更新,插入符号都应保持在文档中相同的绝对位置,除非文档长度因删除而变得小于当前插入符号位置。在这种情况下,插入符位置会调整到文档的末尾。
      自从:
      1.5
      参见:
    • ALWAYS_UPDATE

      public static final int ALWAYS_UPDATE
      表示插入符号位置是总是无论文档更新是否在事件调度线程上执行,都会根据文档更改进行相应更新。
      自从:
      1.5
      参见:
    • listenerList

      protected EventListenerList  listenerList
      事件监听列表。
    • changeEvent

      protected transient ChangeEvent  changeEvent
      模型的更改事件。每个模型实例只需要一个 ChangeEvent,因为事件的唯一(只读)状态是源属性。这里产生的事件源总是“this”。
  • 构造方法详细信息

    • DefaultCaret

      public DefaultCaret()
      构造默认插入符号。
  • 方法详情

    • 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_EDTNEVER_UPDATEALWAYS_UPDATE
      抛出:
      IllegalArgumentException - 如果传递了无效值
      自从:
      1.5
      参见:
    • getUpdatePolicy

      public int getUpdatePolicy()
      获取有关文档更新的插入符号移动策略。
      返回:
      以下值之一:UPDATE_WHEN_ON_EDTNEVER_UPDATEALWAYS_UPDATE
      自从:
      1.5
      参见:
    • getComponent

      protected final JTextComponent  getComponent()
      获取此插入符号绑定到的文本编辑器组件。
      返回:
      组件
    • repaint

      protected final void repaint()
      使插入符被绘制。重绘区域是插入符号的边界框(即插入符号矩形或 this )。

      此方法是线程安全的,尽管大多数 Swing 方法不是。请参阅 Swing 中的并发 了解更多信息。

    • damage

      protected void damage(Rectangle  r)
      损坏插入符周围的区域,使其在新位置重新绘制。如果 paint() 被重新实现,这个方法也应该被重新实现。此方法应更新插入符边界(x、y、宽度和高度)。
      参数:
      r - 插入符号的当前位置
      参见:
    • adjustVisibility

      protected void adjustVisibility(Rectangle  nloc)
      滚动关联的视图(如有必要)以使插入符号可见。由于应该如何完成这在某种程度上是一种策略,因此可以重新实现此方法以更改行为。默认情况下,在关联组件上调用 scrollRectToVisible 方法。
      参数:
      nloc - 滚动到的新位置
    • getSelectionPainter

      protected Highlighter.HighlightPainter  getSelectionPainter()
      获取荧光笔的绘制器。
      返回:
      绘制器
    • positionCaret

      protected void positionCaret(MouseEvent  e)
      尝试使用 viewToModel() 从鼠标事件的坐标设置插入符号的位置。
      参数:
      e - 鼠标事件
    • moveCaret

      protected void moveCaret(MouseEvent  e)
      尝试使用 viewToModel() 从鼠标事件的坐标移动插入符号的位置。如果点和标记不同,这将导致选择。
      参数:
      e - 鼠标事件
    • focusGained

      public void focusGained(FocusEvent  e)
      当包含插入符号的组件获得焦点时调用。这是为了在组件可编辑时将插入符号设置为可见。
      指定者:
      focusGained 在接口 FocusListener
      参数:
      e - 焦点事件
      参见:
    • focusLost

      public void focusLost(FocusEvent  e)
      当包含插入符号的组件失去焦点时调用。这是为了将插入符号的可见性设置为 false。
      指定者:
      focusLost 在接口 FocusListener
      参数:
      e - 焦点事件
      参见:
    • mouseClicked

      public void mouseClicked(MouseEvent  e)
      单击鼠标时调用。如果单击是从 button1 生成的,则双击选择一个词,然后三次单击当前行。
      指定者:
      mouseClicked 在接口 MouseListener
      参数:
      e - 鼠标事件
      参见:
    • mousePressed

      public void mousePressed(MouseEvent  e)
      如果按下按钮 1,则执行此操作以请求关注关联的文本组件,并设置插入符号位置。如果按住 shift 键,插入符号将被移动,可能导致选择,否则插入符号位置将设置为新位置。如果组件未启用,则不会请求焦点。
      指定者:
      mousePressed 在接口 MouseListener
      参数:
      e - 鼠标事件
      参见:
    • mouseReleased

      public void mouseReleased(MouseEvent  e)
      释放鼠标时调用。
      指定者:
      mouseReleased 在接口 MouseListener
      参数:
      e - 鼠标事件
      参见:
    • mouseEntered

      public void mouseEntered(MouseEvent  e)
      当鼠标进入一个区域时调用。
      指定者:
      mouseEntered 在接口 MouseListener
      参数:
      e - 鼠标事件
      参见:
    • mouseExited

      public void mouseExited(MouseEvent  e)
      当鼠标离开区域时调用。
      指定者:
      mouseExited 在接口 MouseListener
      参数:
      e - 鼠标事件
      参见:
    • mouseDragged

      public void mouseDragged(MouseEvent  e)
      根据鼠标指针的当前位置移动插入符号位置。这有效地扩展了选择范围。默认情况下,这仅适用于鼠标按钮 1。
      指定者:
      mouseDragged 在接口 MouseMotionListener
      参数:
      e - 鼠标事件
      参见:
    • mouseMoved

      public void mouseMoved(MouseEvent  e)
      移动鼠标时调用。
      指定者:
      mouseMoved 在接口 MouseMotionListener
      参数:
      e - 鼠标事件
      参见:
    • paint

      public void paint(Graphics  g)
      将插入符号呈现为垂直线。如果重新实现,损坏方法也应该重新实现,因为它假设插入符号的形状是一条垂直线。将插入符颜色设置为 getCaretColor() 返回的值。

      如果关联文档中存在多个文本方向,将呈现一个指示插入符号偏差的标志。仅当关联文档是 AbstractDocument 的子类并且在 bidi 元素结构中存在多个 bidi 级别(即文本具有与其关联的多个方向)时才会发生这种情况。

      指定者:
      paint 在接口 Caret
      参数:
      g - 图形上下文
      参见:
    • install

      public void install(JTextComponent  c)
      在将 UI 安装到 JTextComponent 的界面时调用。这可用于访问通过此接口的实现正在导航的模型。将点和标记设置为 0,并建立文档、属性更改、焦点、鼠标和鼠标移动监听。
      指定者:
      install 在接口 Caret
      参数:
      c - 组件
      参见:
    • deinstall

      public void deinstall(JTextComponent  c)
      从 JTextComponent 的界面中删除 UI 时调用。这用于注销任何附加的监听。
      指定者:
      deinstall 在接口 Caret
      参数:
      c - 组件
      参见:
    • addChangeListener

      public void addChangeListener(ChangeListener  l)
      添加一个监听以在插入符号位置更改时进行跟踪。
      指定者:
      addChangeListener 在接口 Caret
      参数:
      l - 听众
      参见:
    • removeChangeListener

      public void removeChangeListener(ChangeListener  l)
      删除跟踪插入符位置更改的监听。
      指定者:
      removeChangeListener 在接口 Caret
      参数:
      l - 听众
      参见:
    • getChangeListeners

      public ChangeListener [] getChangeListeners()
      返回在此插入符号上注册的所有更改监听的数组。
      返回:
      所有这个插入符号的 ChangeListener s 或一个空数组,如果当前没有注册任何更改监听器
      自从:
      1.4
      参见:
    • fireStateChanged

      protected void fireStateChanged()
      通知所有已注册对此事件类型的通知感兴趣的监听。事件实例是使用传递给 fire 方法的参数延迟创建的。监听列表从最后到最先处理。
      参见:
    • getListeners

      public <T extends EventListener > T[] getListeners(Class <T> listenerType)
      返回当前在此插入符号上注册为 FooListener 的所有对象的数组。 FooListener 是使用 addFooListener 方法注册的。

      您可以使用类文字指定 listenerType 参数,例如 FooListener.class 。例如,您可以使用以下代码查询 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
      返回:
      如果选择可见,则为真
    • isActive

      public boolean isActive()
      确定插入符号当前是否处于活动状态。

      此方法返回 Caret 当前是否处于闪烁状态。它不提供关于它当前是闪烁还是关闭的信息。要确定插入符当前是否已绘制,请使用 isVisible 方法。

      返回:
      true 如果激活 else false
      自从:
      1.5
      参见:
    • isVisible

      public boolean isVisible()
      指示插入符当前是否可见。当插入符号闪烁时,返回值将在插入符号被绘制时为 true 和插入符号未被绘制时为 false 之间变化。 isActive 指示插入符号是否处于闪烁状态,这样它可见,isVisible 表示插入符是否实际上可见。

      希望呈现不同闪烁插入符的子类应该重写 paint 并且仅当此方法返回 true 时才绘制插入符。

      指定者:
      isVisible 在接口 Caret
      返回:
      如果可见则为真否则为假
      参见:
    • setVisible

      public void setVisible(boolean e)
      设置插入符号可见性,并重新绘制插入符号。了解此方法、isVisibleisActive 之间的关系很重要。使用值 true 调用此方法会激活插入符号闪烁。将其设置为 false 可将其完全关闭。要确定闪烁是否处于活动状态,您应该调用 isActive 。实际上,isActive 是一个合适的对应“getter”方法。 isVisible 可用于获取插入符号的当前可见性状态,即当前是否已绘制。此状态将随着插入符号的闪烁而改变。

      下面的列表显示了调用此方法后 isActiveisVisible 的潜在返回值:

      setVisible(true) :

      • isActive(): 真
      • 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()
      获取插入符号的当前位置。
      指定者:
      getDot 在接口 Caret
      返回:
      位置 >= 0
      参见:
    • getMark

      public int getMark()
      获取标记的当前位置。如果有选择,点和标记将不会相同。
      指定者:
      getMark 在接口 Caret
      返回:
      位置 >= 0
      参见:
    • setDot

      public void setDot(int dot)
      将插入符号位置和标记设置到指定位置,并向前偏移。这隐含地将选择范围设置为零。
      指定者:
      setDot 在接口 Caret
      参数:
      dot - 位置 >= 0
      参见:
    • moveDot

      public void moveDot(int dot)
      将插入符号位置移动到指定位置,并向前偏移。
      指定者:
      moveDot 在接口 Caret
      参数:
      dot - 位置 >= 0
      参见:
    • moveDot

      public void moveDot(int dot, Position.Bias  dotBias)
      将插入符号位置移动到指定位置,具有指定的偏差。
      参数:
      dot - 位置 >= 0
      dotBias - 这个位置的偏差,而不是 null
      抛出:
      IllegalArgumentException - 如果偏差为 null
      自从:
      1.6
      参见:
    • setDot

      public void setDot(int dot, Position.Bias  dotBias)
      将插入符号位置和标记设置为具有指定偏差的指定位置。这隐含地将选择范围设置为零。
      参数:
      dot - 位置 >= 0
      dotBias - 这个位置的偏差,而不是 null
      抛出:
      IllegalArgumentException - 如果偏差为 null
      自从:
      1.6
      参见:
    • getDotBias

      public Position.Bias  getDotBias()
      返回插入符号位置的偏差。
      返回:
      插入符号位置的偏差
      自从:
      1.6
    • getMarkBias

      public Position.Bias  getMarkBias()
      返回标记的偏差。
      返回:
      商标的偏见
      自从:
      1.6
    • setMagicCaretPosition

      public void setMagicCaretPosition(Point  p)
      保存当前插入符位置。当发生插入符号向上/向下动作时使用它,在具有不均匀结束位置的行之间移动。
      指定者:
      setMagicCaretPosition 在接口 Caret
      参数:
      p - 位置
      参见:
    • getMagicCaretPosition

      public Point  getMagicCaretPosition()
      获取保存的插入符位置。
      指定者:
      getMagicCaretPosition 在接口 Caret
      返回:
      位置见#setMagicCaretPosition
      参见:
    • equals

      public boolean equals(Object  obj)
      将此对象与指定对象进行比较。不需要比较矩形的超类行为,因此将其更改为对象行为。
      重写:
      equals 在类 Rectangle
      参数:
      obj - 与此字体进行比较的对象
      返回:
      true 如果对象相等; false否则
      参见: