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

Class AsyncBoxView

  • All Implemented Interfaces:
    SwingConstants


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

    当访问子视图时,在相关联的文档上获取读取锁定,以便模型在被访问时是稳定的。

    从以下版本开始:
    1.3
    • 字段详细信息

      • locator

        protected AsyncBoxView.ChildLocator locator
        管理孩子偏移的对象。 用于管理子位置的所有锁都是在此对象上。
    • 构造方法详细信息

      • AsyncBoxView

        public AsyncBoxView​(Element elem,
                            int axis)
        构造一个执行异步布局的框视图。
        参数
        elem - 要表示的模型的元素
        axis - 平铺的轴。 这可以是X_AXIS或Y_AXIS。
    • 方法详细信息

      • 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
      • setEstimatedMajorSpan

        protected void setEstimatedMajorSpan​(boolean isEstimated)
        设置估计的主要属性,以确定主要跨度是否应被视为估计。 如果此属性为true,则长轴上的setSize值将更改沿主轴的要求,并且将忽略增量更改,直到所有子项都被更新(这将导致属性自动设置为false)。 如果属性为false,则主要Span的值将被视为准确的,并且增量更改将被添加到总计中。
        参数
        isEstimated - 估计的主要属性的新值
        从以下版本开始:
        1.4
      • getEstimatedMajorSpan

        protected boolean getEstimatedMajorSpan​()
        目前估计是主要跨度吗?
        结果
        目前估计的主要跨度是否大
        从以下版本开始:
        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)
        调用超类更新子视图,并更新子节点的状态记录。 预期在模型上保留写入锁定,以便不会发生与布局线程的交互(即布局线程在执行任何操作之前获取读锁定)。
        重写:
        replaceView
        参数
        offset - 子视图> = 0的起始偏移量
        length - 要替换的现有视图数=> 0
        views - 要插入的子视图
      • loadChildren

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

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

        参数
        f - 视图工厂
        另请参见:
        setParent(javax.swing.text.View)
      • getViewIndexAtPosition

        protected int getViewIndexAtPosition​(int pos,
                                             Position.Bias b)
        获取代表模型中给定位置的子视图索引。 这是为了在每个子元素有子视图的情况下获取视图。
        参数
        pos - 位置> = 0
        b - 位置偏差
        结果
        表示给定位置的视图的索引,如果没有视图表示该位置,则为-1
      • setParent

        public void setParent​(View parent)
        设置视图的父级。 如果此视图还没有子loadChildren则会重新实现此功能以提供超类行为以及调用loadChildren方法。 孩子不应该加载在构造函数中,因为设置父进程的行为可能会导致他们尝试搜索层次结构(例如获取主机容器)。 如果此视图具有子视图(视图正从视图层次结构中的一个位置移动到另一个视图),则不会调用loadChildren方法。
        重写:
        setParentView
        参数
        parent - 视图的父级,如果没有则为null
      • preferenceChanged

        public void preferenceChanged​(View child,
                                      boolean width,
                                      boolean height)
        子视图可以在父项上调用,以表明偏好已更改,应重新考虑布局。 这被重新实现为在布局线程上排队新工作。 此方法通过孩子从多个线程中消失。
        重写:
        preferenceChangedView
        参数
        child - 子视图
        width - 如果宽度首选项已更改, width true
        height - 如果高度偏好已更改, height true
        另请参见:
        JComponent.revalidate()
      • setSize

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

        由于主轴是异步更新,应该是平铺的小孩的总和,所以长轴将忽略调用。 由于短轴是灵活的,所以如果小跨度发生变化,则排队等待孩子调整大小。

        重写:
        setSizeView
        参数
        width - width> = 0
        height - height> = 0
      • paint

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

        这被实现以确定要渲染的期望区域(即,未剪切区域)是否是最新的。 如果最新的孩子被渲染。 如果不是最新的,则将构建所需区域的任务作为高优先级任务放置在布局队列中。 这通过事件线程通过呈现准备就可以移动,并且如果没有准备就推迟到更晚的时间(因为绘制请求可以重新安排)。

        Specified by:
        paintView
        参数
        g - 要使用的渲染表面
        alloc - 要分配的区域
        另请参见:
        View.paint(java.awt.Graphics, java.awt.Shape)
      • getPreferredSpan

        public float getPreferredSpan​(int axis)
        确定沿着轴的此视图的首选跨度。
        Specified by:
        getPreferredSpanView
        参数
        axis - 可以是View.X_AXIS或View.Y_AXIS
        结果
        视图想要呈现为> = 0的跨度。通常,视图被呈现到返回的跨度,尽管不能保证。 父母可以选择调整大小或打破视图。
        异常
        IllegalArgumentException - 对于无效轴类型
        另请参见:
        View.getPreferredSpan(int)
      • getMinimumSpan

        public float getMinimumSpan​(int axis)
        确定此视图沿轴的最小跨度。
        重写:
        getMinimumSpanView
        参数
        axis - 可以是View.X_AXIS或View.Y_AXIS
        结果
        视图想要呈现为> = 0的跨度。通常,视图被呈现到返回的跨度,尽管不能保证。 父母可以选择调整大小或打破视图。
        异常
        IllegalArgumentException - 对于无效的轴类型
        另请参见:
        View.getPreferredSpan(int)
      • getMaximumSpan

        public float getMaximumSpan​(int axis)
        确定沿着轴的该视图的最大跨度。
        重写:
        getMaximumSpanView
        参数
        axis - 可以是View.X_AXIS或View.Y_AXIS
        结果
        视图想要呈现为> = 0的跨度。通常,视图被呈现到返回的跨度,尽管不能保证。 父母可以选择调整大小或打破视图。
        异常
        IllegalArgumentException - 对于无效的轴类型
        另请参见:
        View.getPreferredSpan(int)
      • getViewCount

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

        public View getView​(int n)
        获取第n个子视图。 由于默认情况下没有子项,因此返回null。
        重写:
        getView中的 View
        参数
        n - 要获取的视图数,> = 0 && <getViewCount()
        结果
        风景
      • getChildAllocation

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

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

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

        这被GUI线程预期调用,在关联的模型上保持一个读锁定。 它被实现以定位子视图并使用ChildLocator对象上的锁来确定它的分配,并且在子视图上调用ViewToModel,使用ChildState对象上的锁来避免与布局线程的交互。

        Specified by:
        viewToModelView
        参数
        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
        重写:
        getNextVisualPositionFromView
        参数
        pos - 转换的位置
        a - 要分配的区域
        direction - 从当前位置的方向,可以被认为是通常在键盘上找到的箭头键; 这可能是以下之一:
        • SwingConstants.WEST
        • SwingConstants.EAST
        • SwingConstants.NORTH
        • SwingConstants.SOUTH
        biasRet - 数组包含已检查的偏差
        b - 偏见
        结果
        模型中最能代表下一个位置视觉位置的位置
        异常
        BadLocationException - 给定的位置不是文档中的有效位置
        IllegalArgumentException - 如果 direction无效