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

Class View

  • All Implemented Interfaces:
    SwingConstants
    已知直接子类:
    AsyncBoxViewComponentViewCompositeViewGlyphViewIconViewImageViewPlainView


    public abstract class View
    extends Object
    implements SwingConstants

    文本包中非常重要的一部分是View类。 顾名思义,它代表文本模型的视图,或文本模型的一部分。 正是这个类负责文本组件的外观。 这个观点并不是一个必须学习的全新的东西,而是像一个轻量级的组件。

    默认情况下,视图很轻。 它包含对父视图的引用,它可以从中获取许多东西而不保持状态,并且它包含对模型部分的引用( Element )。 视图不必完全代表模型中的元素,这只是一个典型的,因此方便的映射。 视图可以替代地保持几个Position对象以保持其在模型中的位置(即,表示元素的片段)。 这通常是格式化视图被分解成碎片的结果。 与元素的实质关系的便利使得更容易构建工厂来生成视图,并且随着模型被更改而使视图的跟踪更容易,并且必须改变视图以反映模型。 因此,简单的视图代表一个元素直接而复杂的视图。

    观点有以下职责:

    参与布局。

    该视图具有setSize方法,如doLayoutsetSizeComponent组合。 该视图具有preferenceChanged方法,其类似于invalidate中的Component除了可以使一个轴无效,并且识别出请求更改的子Component

    视图表示要根据三个值,最小值,首选值和最大跨度计算的大小。 视图中的布局可以在每个轴上独立完成。 对于正常运行的View实现,最小跨度将是<=优选跨度,反过来将是<=最大跨度。

    上面的文字描述了这个图形。

    最小的布局方法是:

    setSize方法应准备好多次调用(即使大小没有变化也可以调用)。 通常调用setSize方法以确保View布局完成,然后再尝试执行需要最新布局的操作。 视图的大小应始终设置为该视图指定的最小和最大跨度内的值。 另外,如果这个视图已经改变了它想要的布局的值,那么这个视图必须始终调用父代的方法,并且期望父节点preferenceChanged 在发送preferenceChanged之前,父视图不需要识别更改。 这允许父视图实现缓存子需求(如果需要)。 调用顺序如下所示:

    父视图和子视图之间的调用序列调用:setSize,getMinimum,getPreferred,getMaximum,getAlignment,setSize

    精确的调用顺序取决于父视图的布局功能(如果视图有任何子节点)。 该视图可以在确定给予每个孩子的情况之前收集孩子的偏好,或者可以一次迭代地更新孩子。

    渲染模型的一部分。

    这是在paint方法中完成的,这很像一个组件绘制方法。 预计意图可能会填补相当大的树。 A View具有以下用于呈现的语义:

    • 该视图在绘制时间从父母获取其分配,因此如果分配的区域与准备处理的区域不同,则必须准备重新布局。
    • 坐标系是相同的托管Component (即Component由返回getContainer方法)。 这意味着一个子视图与父视图生活在同一个坐标系中,除非父对象明确地改变了坐标系。 要安排自己重画,视图可以在主持人Component上调用重绘。
    • 默认是不剪辑孩子。 只有当它真的需要剪裁时才允许视图剪辑更有效。
    • 给出的Graphics对象没有以任何方式初始化。 视图应设置所需的任何设置。
    • A View本质上是透明的。 虽然视图可能会导致其整个分配,通常视图不会。 通过遍历View实现的树来执行View 每个View负责渲染它的孩子。 这种行为取决于线程安全性。 虽然视图实现不一定必须用线程安全性来实现,但是使用并发性的其他视图实现可以取决于树遍历以保证线程安全性。
    • 相对于模型的观点顺序取决于实现。 虽然子视图通常以与模型中相同的顺序排列,但它们可以以完全不同的顺序在视觉上排列。 如果孩子重叠,则查看实现可能具有与它们相关联的Z顺序。

    渲染的方法是:

    在模型和视图坐标系之间进行翻译。

    因为视图对象是从工厂生成的,因此不一定被计入特定模式,必须能够执行转换以正确定位模型的空间表示。 这样做的方法是:

    在进行翻译之前,布局必须是有效的。 翻译无效,在通过DocumentEvent从模型广播更改时,不得尝试DocumentEvent

    响应模型的变化。

    如果整体视图由许多部分表示(如果希望能够更改视图并写入最少的新代码,这是最好的情况),拥有大量的DocumentListener s将是不切实际的。 如果每个视图都听取了模型,只有少数人实际上对任何给定时间播出的变化感兴趣。 由于该模型不具有意见知识,因此无法过滤广播变更信息。 视图层次本身负责传播变更信息。 在视图层次结构中的任何级别,该视图足够了解其子进程最好分发更改信息。 因此,从视图层次结构的根开始广播更改。 这样做的方法是:

    • 构造方法详细信息

      • View

        public View​(Element elem)
        创建一个新的 View对象。
        参数
        elem - Element代表
    • 方法详细信息

      • getParent

        public View getParent​()
        返回视图的父级。
        结果
        如果没有, null
      • isVisible

        public boolean isVisible​()
        返回一个布尔值,指示视图是否可见。 默认情况下,所有视图都可见。
        结果
        总是返回true
      • getPreferredSpan

        public abstract float getPreferredSpan​(int axis)
        确定沿着轴的此视图的首选跨度。
        参数
        axis - 可以是 View.X_AXISView.Y_AXIS
        结果
        视图想要渲染的跨度。 通常,视图被呈现到返回的跨度,尽管不能保证。 父母可以选择调整大小或打破视图
        另请参见:
        getPreferredSpan(int)
      • getMinimumSpan

        public float getMinimumSpan​(int axis)
        确定此视图沿轴的最小跨度。
        参数
        axis - 可以是 View.X_AXISView.Y_AXIS
        结果
        视图可以呈现的最小跨度
        另请参见:
        getPreferredSpan(int)
      • getMaximumSpan

        public float getMaximumSpan​(int axis)
        确定沿着轴的该视图的最大跨度。
        参数
        axis - 可以是 View.X_AXISView.Y_AXIS
        结果
        视图可以呈现的最大跨度
        另请参见:
        getPreferredSpan(int)
      • preferenceChanged

        public void preferenceChanged​(View child,
                                      boolean width,
                                      boolean height)
        子视图可以在父项上调用,以表明偏好已更改,应重新考虑布局。 默认情况下,它向上传播到下一个父级。 根视图将在关联的文本组件上调用revalidate
        参数
        child - 子视图
        width - 如果宽度首选项已更改, width true
        height - 如果高度偏好已更改, height true
        另请参见:
        JComponent.revalidate()
      • getAlignment

        public float getAlignment​(int axis)
        确定沿着轴的该视图的所需对准。 返回所需的对齐方式。 这应该是值> = 0.0和<= 1.0,其中0表示原点对齐,1.0表示与原点的整个跨距对齐。 0.5的对齐将是视图的中心。
        参数
        axis - 可以是 View.X_AXISView.Y_AXIS
        结果
        值0.5
      • paint

        public abstract void paint​(Graphics g,
                                   Shape allocation)
        渲染使用给定的渲染表面和该表面上的区域。 该视图可能需要进行布局并创建子视图,以使其自身能够呈现给定的分配。
        参数
        g - 要使用的渲染表面
        allocation - 要分配的区域
      • setParent

        public void setParent​(View parent)
        建立此视图的父视图。 如果父视图正常工作,这可以保证在任何其他方法之前被调用。 这也是调用的最后一个方法,因为它被调用以指示视图也已从层次结构中移除。 当调用此方法将父设置为null时,此方法对其每个子项执行相同操作,将从断开连接的通知传播到视图树。 如果这被重新实现,应该调用super.setParent()
        参数
        parent - 新的父母,或 null如果视图被从父母移除
      • getViewCount

        public int getViewCount​()
        返回此视图中的视图数。 由于默认值不是复合视图,因此返回0。
        结果
        视图数> = 0
        另请参见:
        getViewCount()
      • getView

        public View getView​(int n)
        获取第n个子视图。 由于默认情况下没有孩子,所以返回null
        参数
        n - 要获取的视图数,> = 0 && <getViewCount()
        结果
        风景
      • removeAll

        public void removeAll​()
        删除所有的孩子。 这是一个方便的电话replace
        从以下版本开始:
        1.3
      • remove

        public void remove​(int i)
        移除给定位置上的一个孩子。 这是一个方便的电话replace
        参数
        i - 的位置
        从以下版本开始:
        1.3
      • insert

        public void insert​(int offs,
                           View v)
        插入单个子视图。 这是一个方便的电话到replace
        参数
        offs - 在> = 0之前插入视图的偏移量
        v - 视图
        从以下版本开始:
        1.3
        另请参见:
        replace(int, int, javax.swing.text.View[])
      • replace

        public void replace​(int offset,
                            int length,
                            View[] views)
        代替子视图。 如果没有任何意见删除这个行为作为插入。 如果没有任何视图添加此行为作为删除。 正在删除的视图将使父级设置为null ,并将它们的内部引用移除,以便它们可以被垃圾回收。 这是实现为不做任何事情,因为默认情况下,视图没有孩子。
        参数
        offset - 将子视图的起始索引插入新视图。 这应该是一个值> = 0和<= getViewCount
        length - 要删除的现有子视图的数量这应该是一个值> = 0和<=(getViewCount() - offset)。
        views - 要添加的子视图。 该值可以是null ,表示没有添加子项(可用于删除)。
        从以下版本开始:
        1.3
      • getViewIndex

        public int getViewIndex​(int pos,
                                Position.Bias b)
        返回表示模型中给定位置的子视图索引。 默认情况下,一个视图没有子节点,因此执行此操作返回-1以指示任何位置没有有效的子索引。
        参数
        pos - 位置> = 0
        b
        结果
        表示给定位置的视图的索引,如果没有视图表示该位置,则为-1
        从以下版本开始:
        1.3
      • getChildAllocation

        public Shape getChildAllocation​(int index,
                                        Shape a)
        获取给定子视图的分配。 这样可以在不考虑视图如何存储其位置的情况下,找出各种视图所在的位置。 这将返回null因为默认是没有任何子视图。
        参数
        index - 小孩的索引> = 0 && < getViewCount()
        a - 这个视图的分配
        结果
        分配给孩子
      • getNextVisualPositionFrom

        public int getNextVisualPositionFrom​(int pos,
                                             Position.Bias b,
                                             Shape a,
                                             int direction,
                                             Position.Bias[] biasRet)
                                      throws BadLocationException
        提供一种方法来确定下一个可视表示的模型位置,在该位置可以放置插入符。 某些视图可能不可见,它们可能与模型中找不到相同的顺序,也可能不允许访问模型中的某些位置。 该方法可以指定在> = 0范围内转换的位置。 如果值为-1,则会自动计算一个位置。 如果值<-1,将抛出BadLocationException
        参数
        pos - 转换的位置
        b - 偏见
        a - 要呈现的分配区域
        direction - 从当前位置的方向,可以被认为是通常在键盘上找到的箭头键。 这将是以下值之一:
        • SwingConstants.WEST
        • SwingConstants.EAST
        • SwingConstants.NORTH
        • SwingConstants.SOUTH
        biasRet - 返回的偏差
        结果
        模型中最能代表下一个位置视觉位置的位置
        异常
        BadLocationException - 给定的位置不是文档中的有效位置
        IllegalArgumentException - 如果 direction没有上述合法值之一
      • modelToView

        public abstract Shape modelToView​(int pos,
                                          Shape a,
                                          Position.Bias b)
                                   throws BadLocationException
        提供给定字符从文档模型坐标空间到视图坐标空间的映射。
        参数
        pos - 所需字符的位置(> = 0)
        a - 视图的区域,其中包含请求的字符
        b - 在位置是两个视图的边界的情况下偏向前一个字符或由偏移表示的下一个字符; b将具有以下值之一:
        • Position.Bias.Forward
        • Position.Bias.Backward
        结果
        在视图坐标空间中,在指定位置处的字符的边界框
        异常
        BadLocationException - 如果指定的位置不表示关联文档中的有效位置
        IllegalArgumentException - 如果 b不是上述合法的 Position.Bias值之一
        另请参见:
        viewToModel(float, float, java.awt.Shape, javax.swing.text.Position.Bias[])
      • modelToView

        public Shape modelToView​(int p0,
                                 Position.Bias b0,
                                 int p1,
                                 Position.Bias b1,
                                 Shape a)
                          throws BadLocationException
        为给定区域提供从文档模型坐标空间到视图坐标空间的映射。 指定的区域被创建为第一个和最后一个字符位置的并集。
        参数
        p0 - 第一个字符的位置(> = 0)
        b0 - 在位置是两个视图的边界的情况下,第一个字符位置的偏移朝向前一个字符或由偏移表示的下一个字符; b0将具有以下值之一:
        • Position.Bias.Forward
        • Position.Bias.Backward
        p1 - 最后一个字符的位置(> = 0)
        b1 - 第二个字符位置的偏差,定义了上述合法值之一
        a - 包含请求地区的视图区域
        结果
        边界框是由第一个和最后一个字符位置指定的区域的并集
        异常
        BadLocationException - 如果给定的位置不表示相关文档中的有效位置
        IllegalArgumentException - 如果 b0b1不是上述合法的 Position.Bias值之一
        另请参见:
        viewToModel(float, float, java.awt.Shape, javax.swing.text.Position.Bias[])
      • viewToModel

        public abstract int viewToModel​(float x,
                                        float y,
                                        Shape a,
                                        Position.Bias[] biasReturn)
        提供从视图坐标空间到模型的逻辑坐标空间的映射。 biasReturn参数将被填入,表示给定的点更接近模型中的下一个字符或模型中的上一个字符。
        参数
        x - X坐标> = 0
        y - Y坐标> = 0
        a - 要呈现的分配区域
        biasReturn - 返回的偏差
        结果
        模型中位置最好地表示视图> = 0中的给定点。将填充 biasReturn参数,以指示给定的点更接近模型中的下一个字符或模型中的上一个字符。
      • insertUpdate

        public void insertUpdate​(DocumentEvent e,
                                 Shape a,
                                 ViewFactory f)
        在该视图负责的位置发出通知。 为了减少子类的负担,此功能扩展到子类可以重新实现的以下调用中:
        1. 如果对此视图负责的元素有任何更改,则调用updateChildren 如果此视图具有表示子元素的子视图,则此方法应执行必要的任何操作,以确保子视图正确表示模型。
        2. 调用forwardUpdate将DocumentEvent转发到适当的子视图。
        3. updateLayout被调用来给视图一个机会修复它的布局,重新安排布局,或什么都不做。
        参数
        e - 相关文件的更改信息
        a - 视图的当前分配
        f - 工厂用来重建如果视图有孩子
        另请参见:
        insertUpdate(javax.swing.event.DocumentEvent, java.awt.Shape, javax.swing.text.ViewFactory)
      • removeUpdate

        public void removeUpdate​(DocumentEvent e,
                                 Shape a,
                                 ViewFactory f)
        在该视图负责的位置发出文档中已删除某些内容的通知。 为了减少子类的负担,此功能扩展到子类可以重新实现的以下调用中:
        1. 如果对此视图负责的元素有任何更改,则调用updateChildren 如果此视图具有表示子元素的子视图,则此方法应执行必要的任何操作,以确保子视图正确表示模型。
        2. 调用forwardUpdate将DocumentEvent转发到适当的子视图。
        3. updateLayout被调用来给视图一个机会修复它的布局,重新安排布局,或什么都不做。
        参数
        e - 相关文件的更改信息
        a - 视图的当前分配
        f - 工厂用来重建如果视图有孩子
        另请参见:
        removeUpdate(javax.swing.event.DocumentEvent, java.awt.Shape, javax.swing.text.ViewFactory)
      • changedUpdate

        public void changedUpdate​(DocumentEvent e,
                                  Shape a,
                                  ViewFactory f)
        在该视图负责的位置向文档发出属性更改的通知。 为了减少子类的负担,此功能扩展到子类可以重新实现的以下调用中:
        1. 如果对该视图负责的元素有任何更改,则调用updateChildren 如果此视图具有表示子元素的子视图,则此方法应执行必要的任何操作,以确保子视图正确表示模型。
        2. 调用forwardUpdate将DocumentEvent转发到适当的子视图。
        3. updateLayout被调用来给视图一个机会修复它的布局,重新安排布局,或什么都不做。
        参数
        e - 相关文件的变更信息
        a - 视图的当前分配
        f - 工厂用来重建如果视图有孩子
        另请参见:
        changedUpdate(javax.swing.event.DocumentEvent, java.awt.Shape, javax.swing.text.ViewFactory)
      • getDocument

        public Document getDocument​()
        获取与视图关联的模型。
        结果
        视图模型, null如果没有
        另请参见:
        getDocument()
      • getStartOffset

        public int getStartOffset​()
        获取该视图负责的模型部分。
        结果
        起始偏移到模型> = 0
        另请参见:
        getStartOffset()
      • getEndOffset

        public int getEndOffset​()
        获取该视图负责的模型部分。
        结果
        结束偏移到模型中> = 0
        另请参见:
        getEndOffset()
      • getElement

        public Element getElement​()
        获取该视图映射到的对象的结构部分。 该视图可能不对元素的整个部分负责。
        结果
        主题
        另请参见:
        getElement()
      • getGraphics

        public Graphics getGraphics​()
        获取Graphics进行渲染。 这可以用于确定字体特征,并且对于打印视图而言不同于组件视图。
        结果
        一个用于呈现的 Graphics对象
        从以下版本开始:
        1.3
      • getAttributes

        public AttributeSet getAttributes​()
        获取渲染时要使用的属性。 默认情况下,这只是返回相关元素的属性。 应该使用此方法而不是直接使用元素来获取对属性的访问,以允许将视图特定的属性混合在一起,或允许视图对子类进行视图特定的属性转换。 每个视图都应记录它为渲染或布局的目的识别哪些属性,并且应该始终通过此方法返回的AttributeSet访问它们。
        结果
        渲染时要使用的属性
      • breakView

        public View breakView​(int axis,
                              int offset,
                              float pos,
                              float len)
        试图在给定的轴上打破这个视图。 这是通过尝试对其孩子进行格式化的视图来调用的。 例如,段落的视图通常会尝试将其子代放置成行,并且表示文本块的视图有时可以分解成较小的部分。

        这是为了返回视图本身而实现的,它表示不可破坏的默认行为。 如果视图确实支持断开,则返回的视图的起始偏移应为给定的偏移量,结束偏移应小于或等于被破坏的视图的最终偏移。

        参数
        axis - 可以是 View.X_AXISView.Y_AXIS
        offset - 断开的片段占据> = 0的文档模型中的位置。这将是返回的片段的起始偏移量
        pos - 断开的视图将占据的轴的位置> = 0。这可能对于诸如选项卡计算
        len - 指定沿着轴的距离,其中需要潜在断点> = 0
        结果
        表示给定跨度的视图的片段,如果视图可以被破坏。 如果视图不支持破坏行为,则返回视图本身。
        另请参见:
        ParagraphView
      • createFragment

        public View createFragment​(int p0,
                                   int p1)
        创建一个表示元素的一部分的视图。 这在格式化操作中可以用于测量视图的片段。 如果视图不支持分片(默认),它将返回自身。
        参数
        p0 - 起始偏移量> = 0。这应该是一个大于或等于元素起始偏移值并小于元素结束偏移量的值。
        p1 - 结束偏移量> p0。 这应该是小于或等于元素结束偏移量的值,并且大于元素起始偏移量。
        结果
        视图片段或本身,如果视图不支持打破碎片
        另请参见:
        LabelView
      • getBreakWeight

        public int getBreakWeight​(int axis,
                                  float pos,
                                  float len)
        确定这种观点的休息时机有多吸引人。 这可以用于确定在格式化过程中调用breakView最有吸引力的视图。 例如,表示具有空格的文本的视图可能比没有空格的视图更有吸引力。 重量越高,休息时间越有吸引力。 等于或低于BadBreakWeight不应被视为休息。 应破坏大于或等于ForcedBreakWeight值。

        这是为了提供返回BadBreakWeight的默认行为,除非长度大于视图的长度,在这种情况下,整个视图表示片段。 除非写出支持破坏行为的观点,否则尝试违反观点是没有吸引力的。 支持破解的视图的示例是LabelView 使用重量的视图的示例是ParagraphView

        参数
        axis - 可以是 View.X_AXISView.Y_AXIS
        pos - 断开视图开始的潜在位置> = 0。这可能有助于计算标签位置
        len -指定从其中可能需要拆分> = 0 POS相对长度
        结果
        重量应该是ForcedBreakWeight和BadBreakWeight之间的值
        另请参见:
        LabelViewParagraphViewBadBreakWeightGoodBreakWeightExcellentBreakWeightForcedBreakWeight
      • getResizeWeight

        public int getResizeWeight​(int axis)
        确定沿着给定轴的视图的可复位性。 0或更小的值不能调整大小。
        参数
        axis - 可以是 View.X_AXISView.Y_AXIS
        结果
        重量
      • setSize

        public void setSize​(float width,
                            float height)
        设置视图的大小。 这应该导致沿着给定轴的视图的布局,如果它有任何布局义务。
        参数
        width - width> = 0
        height - height> = 0
      • getContainer

        public Container getContainer​()
        获取托管视图的容器。 这对于调度重绘,查找主机组件字体等的事情很有用。默认实现是将查询转发到父视图。
        结果
        容器, null如果没有
      • getViewFactory

        public ViewFactory getViewFactory​()
        获取正在提供视图层次结构的ViewFactory实现。 通常,这些观点被认为是在模型最有可能需要工厂时进行更新的参数,但此方法用于在其他时间提供。
        结果
        工厂, null如果没有
      • getToolTipText

        public String getToolTipText​(float x,
                                     float y,
                                     Shape allocation)
        返回指定位置的工具提示文本。 默认实现返回由传入的位置标识的子视图的值。
        参数
        x - x坐标
        y - y坐标
        allocation - 视图的当前分配。
        结果
        在指定位置的工具提示文本
        从以下版本开始:
        1.4
        另请参见:
        JTextComponent.getToolTipText(java.awt.event.MouseEvent)
      • getViewIndex

        public int getViewIndex​(float x,
                                float y,
                                Shape allocation)
        返回表示视图中给定位置的子视图索引。 这遍历所有的孩子返回第一个具有包含界限xy
        参数
        x - x坐标
        y - y坐标
        allocation - 视图的当前分配。
        结果
        表示给定位置的视图的索引,如果没有视图表示该位置,则为-1
        从以下版本开始:
        1.4