Module java.desktop
Package javax.swing.text

Class AsyncBoxView

java.lang.Object
javax.swing.text.View
javax.swing.text.AsyncBoxView
所有已实现的接口:
SwingConstants

public class AsyncBoxView extends View
一个异步执行布局的框。这对于通过不在GUI事件线程上执行任何布局来保持GUI事件线程运行非常有用。布局是在子视图的操作粒度上完成的。在访问每个子视图进行布局的某个部分后(一个可能耗时的操作),剩余的任务可以被放弃,或者可以采取一个新的更高优先级的任务(即为了服务同步请求或可见区域)。

在访问子视图时,会在相关文档上获取读取锁,以确保在访问时模型是稳定的。

自1.3版本起:
1.3
  • Field Details

    • locator

      protected AsyncBoxView.ChildLocator locator
      Object that manages the offsets of the children. All locking for management of child locations is on this object.
  • Constructor Details

    • AsyncBoxView

      public AsyncBoxView(Element elem, int axis)
      Construct a box view that does asynchronous layout.
      参数:
      elem - 要表示的模型元素
      axis - 沿其排列的轴。可以是X_AXIS或Y_AXIS。
  • Method Details

    • getMajorAxis

      public int getMajorAxis()
      获取主轴(子视图沿其排列的轴)。这将具有X_AXIS或Y_AXIS的值。
      返回:
      主轴
    • getMinorAxis

      public int getMinorAxis()
      获取次要轴(与平铺轴正交的轴)。这将具有X_AXIS或Y_AXIS的值。
      返回:
      次要轴
    • getTopInset

      public float getTopInset()
      获取视图周围顶部边距的部分。
      返回:
      视图周围顶部边距的部分
    • setTopInset

      public void setTopInset(float i)
      设置视图周围顶部边距的部分。
      参数:
      i - 插图的值
    • getBottomInset

      public float getBottomInset()
      获取视图周围底部边距的部分。
      返回:
      视图周围底部边距的部分
    • setBottomInset

      public void setBottomInset(float i)
      设置视图周围底部边距的部分。
      参数:
      i - 插图的值
    • getLeftInset

      public float getLeftInset()
      获取视图周围左侧边距的部分。
      返回:
      视图周围左侧边距的部分
    • setLeftInset

      public void setLeftInset(float i)
      设置视图周围左侧边距的部分。
      参数:
      i - 插图的值
    • getRightInset

      public float getRightInset()
      获取视图周围右侧边距的部分。
      返回:
      视图周围右侧边距的部分
    • setRightInset

      public void setRightInset(float i)
      设置视图周围右侧边距的部分。
      参数:
      i - 插图的值
    • getInsetSpan

      protected float getInsetSpan(int axis)
      获取沿着由插图占据的轴的跨度。
      参数:
      axis - 要沿其确定总插图的轴,可以是X_AXIS或Y_AXIS。
      返回:
      由插图占据的轴上的跨度
      自1.4版本起:
      1.4
    • setEstimatedMajorSpan

      protected void setEstimatedMajorSpan(boolean isEstimated)
      设置estimatedMajorSpan属性,确定是否应将主要跨度视为已估计。如果此属性为true,则主轴上的setSize的值将更改主轴上的要求,并且增量更改将被忽略,直到所有子视图都已更新(这将导致属性自动设置为false)。如果属性为false,则将认为majorSpan的值是准确的,并且增量更改将随着计算而被添加到总数中。
      参数:
      isEstimated - estimatedMajorSpan属性的新值
      自1.4版本起:
      1.4
    • getEstimatedMajorSpan

      protected boolean getEstimatedMajorSpan()
      当前主要跨度是否已估计?
      返回:
      当前主要跨度是否已估计
      自1.4版本起:
      1.4
    • getChildState

      protected AsyncBoxView.ChildState getChildState(int index)
      获取表示给定索引处子视图的布局状态的对象。
      参数:
      index - 子索引。应为大于等于0且小于getViewCount()的值。
      返回:
      表示给定索引处子视图的布局状态的对象
    • getLayoutQueue

      protected LayoutQueue getLayoutQueue()
      获取用于布局的队列。
      返回:
      用于布局的队列
    • createChildState

      protected AsyncBoxView.ChildState createChildState(View v)
      通过此方法创建新的ChildState记录,以允许子类扩展ChildState记录以执行/保存更多内容。
      参数:
      v - 视图
      返回:
      新的子状态
    • majorRequirementChange

      protected void majorRequirementChange(AsyncBoxView.ChildState cs, float delta)
      沿主轴更改的要求。当为给定ChildState对象执行布局的线程完成获取子视图新偏好时,将调用此方法。通常这将是布局线程,但如果尝试立即更新某些内容(例如执行模型/视图转换),则可能是事件线程。

      此方法被实现为标记主轴已更改,以便将来检查是否需要将要求发布到父视图时将考虑主轴。如果主轴上的跨度未估计,则通过给定的增量更新主轴上的跨度以反映增量更改。如果主跨度被估计,则增量将被忽略。

      参数:
      cs - 子状态
      delta - 增量
    • minorRequirementChange

      protected void minorRequirementChange(AsyncBoxView.ChildState cs)
      沿次要轴更改的要求。当为给定ChildState对象执行布局的线程完成获取子视图新偏好时,将调用此方法。通常这将是布局线程,但如果尝试立即更新某些内容(例如执行模型/视图转换),则可能是GUI线程。
      参数:
      cs - 子状态
    • flushRequirementChanges

      protected void flushRequirementChanges()
      将偏好更改向上发布到父视图。通常由布局线程调用。
    • replace

      public void replace(int offset, int length, View[] views)
      调用超类来更新子视图,并更新子视图的状态记录。预期在持有模型的写锁时调用此方法,以便不会发生与布局线程的交互(即布局线程在执行任何操作之前会获取读取锁)。
      覆盖:
      replace 在类 View
      参数:
      offset - 开始偏移量进入子视图 >= 0
      length - 要替换的现有视图数 >= 0
      views - 要插入的子视图
    • loadChildren

      protected void loadChildren(ViewFactory f)
      加载所有子元素以初始化视图。这是由setParent方法调用的。子类可以重新实现此方法以不同的方式初始化其子视图。默认实现为每个子元素创建一个子视图。

      通常在更改子元素时会在文档上持有写锁,这可以确保渲染和布局线程的安全。唯一的例外是当初始化视图以表示现有元素(通过此方法)时,因此在初始化时会同步排除preferenceChanged。

      参数:
      f - 视图工厂
      参见:
    • getViewIndexAtPosition

      protected int getViewIndexAtPosition(int pos, Position.Bias b)
      获取表示模型中给定位置的子视图索引。在每个子元素都有一个子视图的情况下,会实现此方法以获取视图。
      参数:
      pos - 位置 >= 0
      b - 位置偏好
      返回:
      表示给定位置的视图的索引,如果没有视图表示该位置则返回-1
    • updateLayout

      protected void updateLayout(DocumentEvent.ElementChange ec, DocumentEvent e, Shape a)
      响应来自模型的更改通知更新布局。实现此方法以在ChildLocator上记录更改,以便正确计算子元素的偏移量。
      覆盖:
      updateLayout 在类 View
      参数:
      ec - 负责此视图的元素的更改(如果没有更改则可能为null)。
      e - 关联文档的更改信息
      a - 视图的当前分配
      参见:
    • setParent

      public void setParent(View parent)
      设置视图的父级。重新实现此方法以提供超类行为,并在此视图尚未具有子视图时调用loadChildren方法。不应在构造函数中加载子视图,因为设置父级的操作可能导致它们尝试搜索层次结构(例如获取托管容器)。如果此视图具有子视图(将视图从视图层次结构中的一个位置移动到另一个位置),则不会调用loadChildren方法。
      覆盖:
      setParent 在类 View
      参数:
      parent - 视图的父级,如果没有则为null
    • preferenceChanged

      public void preferenceChanged(View child, boolean width, boolean height)
      子视图可以调用此方法通知父级偏好已更改,并应重新考虑布局。重新实现此方法以在布局线程上排队新的工作。此方法通过子线程多次发送消息。
      覆盖:
      preferenceChanged 在类 View
      参数:
      child - 子视图
      width - 如果宽度偏好已更改则为true
      height - 如果高度偏好已更改则为true
      参见:
    • setSize

      public void setSize(float width, float height)
      设置视图的大小。如果视图缓存任何布局信息,则应导致视图的布局。

      由于主轴是异步更新的,并且应为平铺子元素的总和,因此对于主轴,此调用将被忽略。由于次轴是灵活的,如果次跨度发生变化,则会排队工作以调整子元素的大小。

      覆盖:
      setSize 在类 View
      参数:
      width - 宽度 >= 0
      height - 高度 >= 0
    • paint

      public void paint(Graphics g, Shape alloc)
      使用给定的分配和渲染表面渲染视图。

      此方法实现为确定要渲染的期望区域(即未裁剪区域)是否是最新的。如果是最新的,则渲染子元素。如果不是最新的,则将构建所需区域的任务放置在布局队列中作为高优先级任务。这样可以通过在准备好时进行渲染来保持事件线程移动,并在准备好时推迟到以后的时间(因为绘制请求可以重新安排)。

      指定者:
      paint 在类 View
      参数:
      g - 要使用的渲染表面
      alloc - 要渲染的分配区域
      参见:
    • getPreferredSpan

      public float getPreferredSpan(int axis)
      确定此视图沿轴的首选跨度。
      指定者:
      getPreferredSpan 在类 View
      参数:
      axis - 可能是View.X_AXIS或View.Y_AXIS
      返回:
      视图希望渲染的跨度 >= 0。通常告诉视图渲染返回的跨度,尽管不能保证。父级可能选择调整或分割视图。
      抛出:
      IllegalArgumentException - 对于无效的轴类型
    • getMinimumSpan

      public float getMinimumSpan(int axis)
      确定此视图沿轴的最小跨度。
      覆盖:
      getMinimumSpan 在类 View
      参数:
      axis - 可能是View.X_AXIS或View.Y_AXIS
      返回:
      视图希望渲染的跨度 >= 0。通常告诉视图渲染返回的跨度,尽管不能保证。父级可能选择调整或分割视图。
      抛出:
      IllegalArgumentException - 对于无效的轴类型
      参见:
    • getMaximumSpan

      public float getMaximumSpan(int axis)
      确定此视图沿轴的最大跨度。
      覆盖:
      getMaximumSpan 在类 View
      参数:
      axis - 可能是View.X_AXIS或View.Y_AXIS
      返回:
      视图希望渲染的跨度 >= 0。通常告诉视图渲染返回的跨度,尽管不能保证。父级可能选择调整或分割视图。
      抛出:
      IllegalArgumentException - 对于无效的轴类型
      参见:
    • getViewCount

      public int getViewCount()
      返回此视图中的视图数。由于默认情况下不是复合视图,因此返回0。
      覆盖:
      getViewCount 在类 View
      返回:
      视图数 >= 0
      参见:
    • getView

      public View getView(int n)
      获取第n个子视图。由于默认情况下没有子视图,因此返回null。
      覆盖:
      getView 在类 View
      参数:
      n - 要获取的视图编号,>= 0 && < getViewCount()
      返回:
      视图
    • getChildAllocation

      public Shape getChildAllocation(int index, Shape a)
      获取给定子视图的分配。这使得可以找出各种视图的位置,而不假定视图存储其位置。由于默认情况下没有任何子视图,因此返回null。
      覆盖:
      getChildAllocation 在类 View
      参数:
      index - 子视图的索引,>= 0 && < getViewCount()
      a - 分配给此视图的分配。
      返回:
      子视图的分配
    • getViewIndex

      public int getViewIndex(int pos, Position.Bias b)
      返回表示模型中给定位置的子视图索引。默认情况下,视图没有子视图,因此实现为返回-1,表示任何位置都没有有效的子视图索引。
      覆盖:
      getViewIndex 在类 View
      参数:
      pos - 位置 >= 0
      b - 偏好
      返回:
      表示给定位置的视图的索引,如果没有视图表示该位置,则返回-1
      自:
      1.3
    • modelToView

      public Shape modelToView(int pos, Shape a, Position.Bias b) throws BadLocationException
      提供了从文档模型坐标空间到其映射的视图的坐标空间的映射。
      指定者:
      modelToView 在类 View
      参数:
      pos - 要转换的位置 >= 0
      a - 分配的区域以渲染
      b - 朝向前一个字符或下一个字符的偏好,如果位置是两个视图的边界之一的情况下
      返回:
      返回给定位置的边界框
      抛出:
      BadLocationException - 如果给定位置在关联文档中不表示有效位置
      IllegalArgumentException - 对于无效的偏好参数
      参见:
    • viewToModel

      public int viewToModel(float x, float y, Shape a, Position.Bias[] biasReturn)
      提供了从视图坐标空间到模型的逻辑坐标空间的映射。 biasReturn 参数将被填充以指示给定点更接近模型中的下一个字符还是前一个字符。

      预计将由GUI线程调用,持有关联模型的读取锁。它被实现为使用ChildLocator对象上的锁定来定位子视图并确定其分配,并使用ChildState对象上的锁定在子视图上调用viewToModel,以避免与布局线程的交互。

      指定者:
      viewToModel 在类 View
      参数:
      x - X坐标 >= 0
      y - Y坐标 >= 0
      a - 分配的区域以渲染
      biasReturn - 返回的偏好
      返回:
      最佳表示给定视图中给定点的模型内位置 >= 0。 biasReturn 参数将被填充以指示给定点更接近模型中的下一个字符还是前一个字符。
    • getNextVisualPositionFrom

      public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a, int direction, Position.Bias[] biasRet) throws BadLocationException
      提供了一种确定下一个可能放置插入符号的视觉表示模型位置的方法。一些视图可能不可见,它们可能不按照在模型中找到的顺序排列,或者它们可能不允许访问模型中的某些位置。此方法使得可以在范围内指定要转换的位置 >=0。如果值为-1,将自动计算位置。如果值< -1,则将抛出BadLocationException
      覆盖:
      getNextVisualPositionFrom 在类 View
      参数:
      pos - 要转换的位置
      b - 偏好
      a - 分配的区域以渲染
      direction - 从当前位置出发的方向,可以认为是键盘上通常找到的箭头键;这可能是以下之一:
      • SwingConstants.WEST
      • SwingConstants.EAST
      • SwingConstants.NORTH
      • SwingConstants.SOUTH
      biasRet - 包含已检查的偏好的数组
      返回:
      最佳表示下一个位置视觉位置的模型内位置
      抛出:
      BadLocationException - 给定位置不是文档中的有效位置
      IllegalArgumentException - 如果direction无效