Module java.desktop
Package javax.swing.text

Class View

java.lang.Object
javax.swing.text.View
所有已实现的接口:
SwingConstants
直接已知的子类:
AsyncBoxView, ComponentView, CompositeView, GlyphView, IconView, ImageView, PlainView

public abstract class View extends Object implements SwingConstants

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

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

视图有以下职责:

参与布局。

视图有一个setSize方法,类似于Component中的doLayoutsetSize的结合。视图有一个preferenceChanged方法,类似于Component中的invalidate,只是可以仅使一个轴无效,并且可以标识请求更改的子级。

视图以三个值表示其希望的大小,即最小、首选和最大跨度。视图中的布局可以独立于每个轴进行。对于一个正常工作的视图实现,最小跨度应该小于等于首选跨度,而首选跨度又应该小于等于最大跨度。

上述文本描述了这个图形。

布局的最小方法集包括:

setSize方法应该准备好被多次调用(即使大小没有改变也可能被调用)。通常会调用setSize方法以确保视图布局在尝试执行需要最新布局的操作之前已经完成。视图的大小应始终设置为在该视图指定的最小和最大跨度之内的值。此外,如果视图已更改其希望的布局值并且期望父级视图遵守这些值,视图必须始终在父级上调用preferenceChanged方法。父视图不需要在发送preferenceChanged之前识别更改。这允许父视图实现根据需要缓存子级要求。调用顺序看起来像下面这样:

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

渲染模型的一部分。
View对于渲染有以下语义:

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

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

DocumentEvent从模型广播更改时,转换是无效的,不应尝试。

响应来自模型的更改。
DocumentListener将是不切实际的。如果每个视图都监听模型,那么在任何给定时间,只有少数视图实际上会对广播的更改感兴趣。由于模型对视图没有任何了解,因此无法过滤更改信息的广播。相反,视图层次结构本身负责传播更改信息。在视图层次结构的任何级别,该视图对其子级有足够的了解,以最佳地进一步分发更改信息。因此,更改从视图层次结构的根开始广播。执行此操作的方法包括:

  • Field Details

  • Constructor Details

    • View

      public View(Element elem)
      创建一个新的View对象。
      参数:
      elem - 要表示的Element
  • Method Details

    • getParent

      public View getParent()
      返回视图的父级。
      返回:
      父级,如果不存在则返回null
    • isVisible

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

      public abstract float getPreferredSpan(int axis)
      确定沿轴的首选跨度。
      参数:
      axis - 可以是View.X_AXISView.Y_AXIS
      返回:
      视图希望呈现的跨度。通常会告诉视图呈现返回的跨度,尽管不能保证。父级可能选择调整大小或断开视图
    • getMinimumSpan

      public float getMinimumSpan(int axis)
      确定沿轴的最小跨度。
      参数:
      axis - 可以是View.X_AXISView.Y_AXIS
      返回:
      视图可以呈现的最小跨度
      参见:
    • getMaximumSpan

      public float getMaximumSpan(int axis)
      确定沿轴的最大跨度。
      参数:
      axis - 可以是View.X_AXISView.Y_AXIS
      返回:
      视图可以呈现的最大跨度
      参见:
    • preferenceChanged

      public void preferenceChanged(View child, boolean width, boolean height)
      子视图可以调用此方法通知父级偏好已更改,并应重新考虑布局。默认情况下,这只是向上传播到下一个父级。根视图将在关联的文本组件上调用revalidate
      参数:
      child - 子视图
      width - 如果宽度偏好已更改,则为true
      height - 如果高度偏好已更改,则为true
      参见:
    • 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
    • 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版本起:
      1.3
    • insert

      public void insert(int offs, View v)
      插入单个子视图。这是一个方便调用replace
      参数:
      offs - 要插入的视图之前的偏移量 >= 0
      v - 视图
      自1.3版本起:
      1.3
      参见:
    • append

      public void append(View v)
      追加单个子视图。这是一个方便调用replace
      参数:
      v - 视图
      自1.3版本起:
      1.3
      参见:
    • replace

      public void replace(int offset, int length, View[] views)
      替换子视图。如果没有要移除的视图,则此操作将充当插入操作。如果没有要添加的视图,则此操作将充当移除操作。被移除的视图的父级将设置为null,并且对它们的内部引用将被移除,以便它们可以被垃圾回收。这被实现为不执行任何操作,因为默认情况下视图没有子视图。
      参数:
      offset - 要插入新视图的子视图的起始索引。这应该是一个值 >= 0 且 <= getViewCount
      length - 要移除的现有子视图的数量。这应该是一个值 >= 0 且 <= (getViewCount() - offset)。
      views - 要添加的子视图。此值可以为null,表示不添加任何子视图(有助于移除)。
      自1.3版本起:
      1.3
    • getViewIndex

      public int getViewIndex(int pos, Position.Bias b)
      返回表示模型中给定位置的子视图索引。默认情况下,视图没有子视图,因此实现为返回-1,表示没有任何有效的子索引与任何位置对应。
      参数:
      pos - 位置 >= 0
      b - 偏移
      返回:
      表示给定位置的视图的索引,如果没有视图表示该位置,则返回-1
      自1.3版本起:
      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
      提供一种确定下一个在视觉上表示的模型位置,可以在其中放置插入符号的方法。某些视图可能不可见,它们可能不按照在模型中找到的顺序排列,或者它们可能根本不允许访问模型中的某些位置。此方法使得可以指定要在范围内转换的位置,如果值为-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值之一
      参见:
    • 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

      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 - 如果视图具有子视图,则用于重建的工厂
      参见:
    • removeUpdate

      public void removeUpdate(DocumentEvent e, Shape a, ViewFactory f)
      给出通知,说明文档中的某些内容已从此视图负责的位置中删除。为了减轻子类的负担,此功能分散到以下调用中,子类可以重新实现:
      1. updateChildren如果此视图负责的元素发生任何更改,则会调用。如果此视图具有代表子元素的子视图,则此方法应执行必要的操作,以确保子视图正确表示模型。
      2. forwardUpdate用于将DocumentEvent转发给适当的子视图。
      3. updateLayout用于让视图有机会修复其布局,重新安排布局或不执行任何操作。
      参数:
      e - 关联文档中的更改信息
      a - 视图的当前分配
      f - 如果视图具有子视图代表子元素,则用于重建的工厂
      参见:
    • changedUpdate

      public void changedUpdate(DocumentEvent e, Shape a, ViewFactory f)
      来自文档的通知,说明此视图负责的位置中的属性已更改。为了减轻子类的负担,此功能分散到以下调用中,子类可以重新实现:
      1. updateChildren如果此视图负责的元素发生任何更改,则会调用。如果此视图具有代表子元素的子视图,则此方法应执行必要的操作,以确保子视图正确表示模型。
      2. forwardUpdate用于将DocumentEvent转发给适当的子视图。
      3. updateLayout用于让视图有机会修复其布局,重新安排布局或不执行任何操作。
      参数:
      e - 关联文档中的更改信息
      a - 视图的当前分配
      f - 如果视图具有子视图代表子元素,则用于重建的工厂
      参见:
    • getDocument

      public Document getDocument()
      获取与视图关联的模型。
      返回:
      视图模型,如果没有则为null
    • getStartOffset

      public int getStartOffset()
      获取此视图负责的模型部分。
      返回:
      模型中的起始偏移量 >= 0
      参见:
    • getEndOffset

      public int getEndOffset()
      获取此视图负责的模型部分。
      返回:
      模型中的结束偏移量 >= 0
      参见:
    • getElement

      public Element 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
      返回:
      表示给定跨度的视图片段,如果视图可以中断。如果视图不支持中断行为,则返回视图本身。
      参见:
    • createFragment

      public View createFragment(int p0, int p1)
      创建表示元素部分的视图。在格式化操作期间,这可能对于测量视图片段很有用。如果视图不支持分段(默认情况),则应返回自身。
      参数:
      p0 - 起始偏移量 >= 0。这应该是大于或等于元素起始偏移量且小于元素结束偏移量的值。
      p1 - 结束偏移量 > p0。这应该是小于或等于元素结束偏移量且大于元素起始偏移量的值。
      返回:
      视图片段,如果视图不支持分段,则为自身
      参见:
    • 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 - 指定从pos的相对长度开始希望进行中断的位置 >= 0
      返回:
      权重,应该是介于ForcedBreakWeight和BadBreakWeight之间的值
      参见:
    • 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 - 视图的当前分配
      返回值:
      指定位置的工具提示文本
      自版本:
      1.4
      参见:
    • getViewIndex

      public int getViewIndex(float x, float y, Shape allocation)
      返回表示视图中给定位置的子视图索引。这会遍历所有子视图,返回第一个包含xy的边界的子视图。
      参数:
      x - x坐标
      y - y坐标
      allocation - 视图的当前分配
      返回值:
      表示给定位置的视图的索引,如果没有视图表示该位置则返回-1
      自版本:
      1.4
    • updateChildren

      protected boolean updateChildren(DocumentEvent.ElementChange ec, DocumentEvent e, ViewFactory f)
      在接收到模型更改通知并且该视图负责的元素有更改记录时,更新子视图。此方法被实现为假定子视图直接负责该视图代表的元素的子元素。使用ViewFactory为在给定的ElementChange中指定为添加的每个元素创建子视图,从给定的索引开始。表示已删除的元素的子视图数量将被移除。
      参数:
      ec - 负责的元素的更改信息。如果调用此方法,则此参数不应为null
      e - 与关联文档的更改信息
      f - 用于构建子视图的工厂
      返回值:
      子视图是否表示该视图负责的子元素。某些视图创建代表其负责的元素一部分的子视图,应返回false。此信息用于确定是否应将添加元素范围内的视图转发或不转发
      自版本:
      1.3
      参见:
    • forwardUpdate

      protected void forwardUpdate(DocumentEvent.ElementChange ec, DocumentEvent e, Shape a, ViewFactory f)
      将给定的DocumentEvent转发到需要通知模型更改的子视图。如果对该视图负责的元素有更改,则在转发时应考虑这些更改(即新的子视图不应该收到通知)。
      参数:
      ec - 对该视图负责的元素的更改(如果没有更改,则可能为null)。
      e - 与关联文档的更改信息
      a - 视图的当前分配
      f - 如果视图有子视图,则用于重建的工厂
      自版本:
      1.3
      参见:
    • forwardUpdateToView

      protected void forwardUpdateToView(View v, DocumentEvent e, Shape a, ViewFactory f)
      DocumentEvent转发给给定的子视图。这只是通过调用insertUpdateremoveUpdatechangedUpdate来向视图发送消息,具体取决于事件的类型。这由forwardUpdate调用,以将事件转发给需要的子视图。
      参数:
      v - 要转发事件的子视图
      e - 与关联文档的更改信息
      a - 视图的当前分配
      f - 如果视图有子视图,则用于重建的工厂
      自版本:
      1.3
      参见:
    • updateLayout

      protected void updateLayout(DocumentEvent.ElementChange ec, DocumentEvent e, Shape a)
      在接收到来自模型的更改通知时更新布局。这被实现为调用preferenceChanged以重新安排新的布局,如果ElementChange记录不为null
      参数:
      ec - 对该视图负责的元素的更改(如果没有更改,则可能为null
      e - 与关联文档的更改信息
      a - 视图的当前分配
      自版本:
      1.3
      参见:
    • modelToView

      @Deprecated public Shape modelToView(int pos, Shape a) throws BadLocationException
      Deprecated.
      提供从文档模型坐标空间到其映射视图的坐标空间的映射。这被实现为将偏向默认为Position.Bias.Forward,这以前是隐含的。
      参数:
      pos - 要转换的位置 >= 0
      a - 要渲染的分配区域
      返回值:
      返回给定位置的边界框
      抛出:
      BadLocationException - 如果给定位置在关联文档中不表示有效位置
      参见:
    • viewToModel

      @Deprecated public int viewToModel(float x, float y, Shape a)
      Deprecated.
      提供从视图坐标空间到模型的逻辑坐标空间的映射。
      参数:
      x - X坐标 >= 0
      y - Y坐标 >= 0
      a - 要渲染的分配区域
      返回值:
      最能代表视图中给定点的模型中的位置 >= 0
      参见: