Module  java.desktop
软件包  javax.swing.text

Class DefaultCaret

  • All Implemented Interfaces:
    FocusListenerMouseListenerMouseMotionListenerShapeSerializableCloneableEventListenerCaret
    已知直接子类:
    BasicTextUI.BasicCaret


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

    此实现期望异步通知的两个来源。 定时器线程异步触发,并使插入符简单地重新绘制最近的边界框。 插入符号也会跟踪文档的修改。 通常情况下,由于某些鼠标或键盘事件,事件发送线程将发生。 同步和异步文档更新的插入行为由UpdatePolicy属性控制。 在任何情况下,新插入符位置的重绘将发生在事件线程上,因为对事件线程的调用只能安全modelToView

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

    与相关联的文本组件绑定的荧光笔用于默认呈现选择。 选择外观可以通过提供一个画家来定制,用于亮点。 默认情况下,将使用一个绘画器,它将呈现SelectionColor属性中关联的文本组件中指定的SelectionColor 这可以通过重新实现getSelectionPainter方法来轻松改变。

    可以通过重新实现涂漆方法来实现定制的插入符号外观。 如果油漆方法发生变化,还应重新实施损坏方法,以便对所需的区域进行重新绘制,以提供插入符号。 插入符号扩展Rectangle类,该类用于保存上一次呈现插入符的位置的边界框。 这使得插入符号在插入符号移动时不会调用modelToView,因此在模型更新和视图修复之间是不稳定的(即不能保证传递给DocumentListeners的顺序),因此可以以线程安全的方式重绘。

    当插入位置更改时,魔术插入位置设置为null。 定时器用于确定新位置(插入符号更改后)。 当定时器触发时,如果魔术插入位置仍为空,则它将重置为当前插入符位置。 任何改变插入位置并希望魔术插入位置保持不变的动作必须记住魔术插入位置,更改光标,然后将魔法插入符位置设置为其原始值。 这有一个好处,只有想要魔术插入位置的动作(如开/关)需要知道。

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

    另请参见:
    CaretSerialized Form
    • 字段详细信息

      • NEVER_UPDATE

        public static final int NEVER_UPDATE
        表示插入符号应保持在文档中相同的绝对位置,无论文档更新如何,除非文档长度由于删除而小于当前插入符号位置。 在这种情况下,插入符位置被调整到文档的末尾。
        从以下版本开始:
        1.5
        另请参见:
        setUpdatePolicy(int)getUpdatePolicy()Constant Field Values
      • changeEvent

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

      • 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()adjustVisibility(java.awt.Rectangle)UPDATE_WHEN_ON_EDTNEVER_UPDATEALWAYS_UPDATE
      • getComponent

        protected final JTextComponent getComponent​()
        获取此插入符所绑定的文本编辑器组件。
        结果
        组件
      • repaint

        protected final void repaint​()
        导致插入符号被画。 重绘区域是插入符号的边框(即插入符号矩形或这个 )。

        这种方法是线程安全的,尽管大多数Swing方法都不是。 详情请见Concurrency in Swing

      • damage

        protected void damage​(Rectangle r)
        损坏插入符号周围的区域,使其在新的位置重画。 如果重新实现了paint(),那么这个方法也应该被重新实现。 此方法应更新插入符(x,y,width和height)。
        参数
        r - 插入符号的当前位置
        另请参见:
        paint(java.awt.Graphics)
      • adjustVisibility

        protected void adjustVisibility​(Rectangle nloc)
        滚动关联视图(如有必要)使插入符可见。 由于这样做应该是一些策略,所以可以重新实现这种方法来改变行为。 默认情况下,在相关组件上调用scrollRectToVisible方法。
        参数
        nloc - 滚动到的新位置
      • positionCaret

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

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

        public void mousePressed​(MouseEvent e)
        如果按下按钮1,则将其实现为请求关注相关联的文本组件,并设置插入符位置。 如果按住Shift键,插入符将被移动,可能导致选择,否则插入符位置将被设置到新位置。 如果组件未启用,则不会有焦点请求。
        Specified by:
        mousePressed在接口 MouseListener
        参数
        e - 鼠标事件
        另请参见:
        MouseListener.mousePressed(java.awt.event.MouseEvent)
      • paint

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

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

        Specified by:
        paint在接口 Caret
        参数
        g - 图形上下文
        另请参见:
        damage(java.awt.Rectangle)
      • install

        public void install​(JTextComponent c)
        当UI被安装到JTextComponent的接口时调用。 这可以用来访问由该接口的实现导航的模型。 将点和标记设置为0,并建立文档,属性更改,焦点,鼠标和鼠标移动侦听器。
        Specified by:
        install在接口 Caret
        参数
        c - 组件
        另请参见:
        Caret.install(javax.swing.text.JTextComponent)
      • fireStateChanged

        protected void fireStateChanged​()
        通知所有在此事件类型上通知有兴趣的听众。 事件实例使用传递给fire方法的参数进行懒惰创建。 侦听器列表被最后处理。
        另请参见:
        EventListenerList
      • 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
        另请参见:
        getChangeListeners()
      • setSelectionVisible

        public void setSelectionVisible​(boolean vis)
        更改选择的可见性。
        Specified by:
        setSelectionVisible接口 Caret
        参数
        vis - 新的知名度
      • isSelectionVisible

        public boolean isSelectionVisible​()
        检查当前选择是否可见。
        Specified by:
        isSelectionVisible在接口 Caret
        结果
        如果选择是可见的,则为真
      • isActive

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

        此方法返回是否Caret当前处于闪烁状态。 它不提供有关当前是否闪烁的信息。 要确定插入符号当前是否使用isVisible方法。

        结果
        true如果有活动,其他 false
        从以下版本开始:
        1.5
        另请参见:
        isVisible()
      • isVisible

        public boolean isVisible​()
        指示插入符号是否可见。 当插入符号闪烁时,返回值将在true之间,当插入符号被绘制时变为false,当插入符号未被绘制时,该值将变为false。 isActive指示插入符是否处于闪烁状态,以使得它可以是可见的,并且isVisible指示插入符是否实际可见。

        希望呈现不同闪烁插入符的子类应该覆盖绘画,并且只有在此方法返回true时才绘制插入符。

        Specified by:
        isVisible在接口 Caret
        结果
        如果可见,则返回true false
        另请参见:
        Caret.isVisible()isActive()
      • setVisible

        public void setVisible​(boolean e)
        设置插入符的可见性,并重新绘制插入符号。 了解这种方法isVisibleisActive之间的关系很重要。 调用此方法值为true激活插入符号闪烁。 将其设置为false将其完全关闭。 要确定闪烁是否处于活动状态,应拨打isActive 实际上, isActive是一个适当的相应的“getter”方法。 isVisible可以用于获取当前可见状态的插入符号,意思是否它当前被绘制。 这种状态将随着插入符号闪烁打开和关闭而改变。

        这是一个列表,显示了调用此方法后的isActiveisVisible的潜在返回值:

        setVisible(true)

        • isActive():true
        • isVisible():true或false,取决于插入符号是否闪烁开或关

        setVisible(false)

        • isActive():false
        • isVisible():false
        Specified by:
        setVisible在接口 Caret
        参数
        e - 可见性说明符
        另请参见:
        isActive()Caret.setVisible(boolean)
      • setBlinkRate

        public void setBlinkRate​(int rate)
        设置插入眨眼速率。
        Specified by:
        setBlinkRate在接口 Caret
        参数
        rate - 以毫秒为单位的速率,0停止闪烁
        另请参见:
        Caret.setBlinkRate(int)
      • getBlinkRate

        public int getBlinkRate​()
        获得插入眨眼率。
        Specified by:
        getBlinkRate在接口 Caret
        结果
        延迟以毫秒为单位。 如果这是零,插入符号不会闪烁。
        另请参见:
        Caret.getBlinkRate()
      • getDot

        public int getDot​()
        获取插入符号的当前位置。
        Specified by:
        getDot在接口 Caret
        结果
        位置> = 0
        另请参见:
        Caret.getDot()
      • getMark

        public int getMark​()
        获取标记的当前位置。 如果有选择,点和标记将不一样。
        Specified by:
        getMark在接口 Caret
        结果
        位置> = 0
        另请参见:
        Caret.getMark()
      • setDot

        public void setDot​(int dot)
        设置插入符号位置并标记到指定的位置,并具有正向偏置。 这将隐含地将选择范围设置为零。
        Specified by:
        setDot在接口 Caret
        参数
        dot - 位置> = 0
        另请参见:
        setDot(int, Position.Bias)Caret.setDot(int)
      • moveDot

        public void moveDot​(int dot,
                            Position.Bias dotBias)
        将插入符号位置移动到指定的位置,并指定偏置。
        参数
        dot - 位置> = 0
        dotBias - 这个职位的偏差,不是 null
        异常
        IllegalArgumentException - 如果偏差是 null
        从以下版本开始:
        1.6
        另请参见:
        Caret.moveDot(int)
      • setDot

        public void setDot​(int dot,
                           Position.Bias dotBias)
        设置插入符号位置并标记到指定的位置,并具有指定的偏置。 这将隐含地将选择范围设置为零。
        参数
        dot - 位置> = 0
        dotBias - 这个位置的偏差,不是 null
        异常
        IllegalArgumentException - 如果偏见是 null
        从以下版本开始:
        1.6
        另请参见:
        Caret.setDot(int)
      • getDotBias

        public Position.Bias getDotBias​()
        返回插入位置的偏移。
        结果
        插入位置的偏见
        从以下版本开始:
        1.6
      • getMarkBias

        public Position.Bias getMarkBias​()
        返回标记的偏差。
        结果
        标记的偏见
        从以下版本开始:
        1.6
      • setMagicCaretPosition

        public void setMagicCaretPosition​(Point p)
        保存当前插入位置。 这是在插入向上/向下动作发生时使用,在具有不均匀结束位置的线之间移动。
        Specified by:
        setMagicCaretPosition在接口 Caret
        参数
        p - 位置
        另请参见:
        getMagicCaretPosition()
      • equals

        public boolean equals​(Object obj)
        将此对象与指定的对象进行比较。 比较矩形的超类行为是不希望的,所以这被更改为Object行为。
        重写:
        equalsRectangle
        参数
        obj - 对比这个字体的对象
        结果
        true如果对象相等; 否则为false
        另请参见:
        Object.hashCode()HashMap
      • toString

        public String toString​()
        说明从类别复制: Rectangle
        返回一个 String代表这个 Rectangle及其值。
        重写:
        toStringRectangle
        结果
        一个 String代表这个 Rectangle对象的坐标和大小值。