模块  java.desktop
软件包  javax.swing.text

Class View

  • 实现的所有接口
    SwingConstants
    已知直接子类:
    AsyncBoxViewComponentViewCompositeViewGlyphViewIconViewImageViewPlainView

    public abstract class View
    extends Object
    implements SwingConstants

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

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

    视图具有以下职责:

    参与布局。

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

    视图以三个值(最小,最优和最大跨度)表示它希望的大小。 视图中的布局可以在每个轴上独立完成。 对于功能正常的View实现,最小跨度<=首选跨度,而<=最大跨度。

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

    布局的最小方法集是:

    应该准备多次调用setSize方法(即,即使大小没有改变也可以调用它)。 通常调用setSize方法以确保在尝试对其执行需要最新布局的操作之前完成View布局。 始终将视图的大小设置为该视图指定的最小和最大范围内的值。 此外,如果视图已更改其所需布局的值,则视图必须始终在父preferenceChanged上调用preferenceChanged方法,并期望父级符合。 在发送preferenceChanged之前,父视图不需要识别更改。 这允许父View实现在需要时缓存子需求。 调用序列如下所示:

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

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

    渲染模型的一部分。

    这是在paint方法中完成的,这非常类似于组件绘制方法。 预计视图可能会填充相当大的树。 View具有以下用于呈现的语义:

    • 视图在绘制时从父级获取其分配,因此如果分配的区域与准备处理的区域不同,则必须准备重做布局。
    • 坐标系是相同的托管Component (即Component由返回getContainer方法)。 这意味着除非父级显式更改了坐标系,否则子视图与父视图位于同一坐标系中。 要安排自己重新绘制视图,可以在主机Component上调用重绘。
    • 默认设置是不剪辑子项。 仅当视图真正感觉需要剪切时才允许视图剪辑更有效。
    • 给出的Graphics对象未以任何方式初始化。 视图应设置所需的任何设置。
    • View本质上是透明的。 虽然视图可以呈现为其整个分配,但通常视图不会。 通过遍历View实现的树来执行渲染。 每个View负责渲染其子项。 这种行为取决于线程安全性。 虽然视图实现不一定必须在考虑线程安全的情况下实现,但是其他利用并发的视图实现可以依赖于树遍历来保证线程安全。
    • 相对于模型的视图顺序取决于实现。 尽管子视图通常将以与它们在模型中出现的顺序相同的顺序排列,但是它们可以以完全不同的顺序在视觉上排列。 如果子项重叠,则视图实现可能具有与它们关联的Z-Order。

    渲染方法是:

    在模型和视图坐标系之间进行转换。

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

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

    响应模型的变化。

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

    • 构造方法详细信息

      • 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 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 - 宽度> = 0
        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 - View的当前分配。
        结果
        指定位置的工具提示文本
        从以下版本开始:
        1.4
        另请参见:
        JTextComponent.getToolTipText(java.awt.event.MouseEvent)
      • getViewIndex

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