Module java.desktop
Package javax.swing

Class JViewport

所有已实现的接口:
ImageObserver, MenuContainer, Serializable, Accessible

public class JViewport extends JComponent implements Accessible
你看到底层信息的“视口”或“窗口”。当你滚动时,移动的是视口。就像透过相机取景器一样。将取景器向上移动会使图片顶部出现新的东西,而底部的东西会消失。

默认情况下,JViewport是不透明的。要更改这一点,请使用setOpaque方法。

注意:我们实现了一个更快的滚动算法,不需要缓冲区来绘制。算法的工作方式如下:

  1. 检查视图和父视图是否是JComponents,如果不是,则停止并重绘整个视口。
  2. 如果视口被祖先遮挡,停止并重绘整个视口。
  3. 计算将变为可见的区域,如果与视口一样大,则停止并重绘整个视图区域。
  4. 获取祖先Window的图形并在滚动区域上执行copyArea
  5. 通知视图重新绘制新可见区域。
  6. 下次在视口上调用绘制时,如果剪辑区域小于视口大小,则启动定时器重新绘制整个区域。
一般来说,这种方法要快得多。与后备存储方法相比,这种方法避免了维护离屏缓冲区的开销以及执行两次copyArea的开销。与非后备存储情况相比,这种方法将大大减少绘制区域。

当视口被另一个窗口遮挡或部分离屏时,这种方法可能比后备存储方法慢。当另一个窗口遮挡视口时,copyArea将复制垃圾,并且系统将生成一个绘制事件来通知我们需要绘制新暴露的区域。处理这种情况的唯一方法是重新绘制整个视口,这可能比后备存储情况下的性能慢。在大多数应用程序中,用户很少会在视口被另一个窗口遮挡或离屏时滚动,因此当被遮挡时,这种优化通常值得性能损失。

警告:Swing不是线程安全的。更多信息请参见Swing的线程策略

警告:此类的序列化对象将不兼容未来的Swing版本。当前的序列化支持适用于短期存储或在运行相同Swing版本的应用程序之间的RMI。从1.4开始,已将所有JavaBeans的长期存储支持添加到java.beans包中。请参见XMLEncoder

自:
1.2
参见:
  • Field Details

    • isViewSizeSet

      protected boolean isViewSizeSet
      当视口尺寸已确定时为真。默认值为false。
    • lastPaintPosition

      protected Point lastPaintPosition
      我们绘制的最后一个viewPosition,以便我们知道多少后备存储图像是有效的。
    • backingStore

      @Deprecated protected boolean backingStore
      Deprecated.
      As of Java 2 platform v1.3
      当此视口维护其内容的离屏图像时为真,以便通过快速“位块传输”操作而不是通过访问视图对象来构造显示来进行一些滚动。默认值为false
      参见:
    • backingStoreImage

      protected transient Image backingStoreImage
      用于后备存储的视图图像。
    • scrollUnderway

      protected boolean scrollUnderway
      scrollUnderway标志用于像JList这样的组件。当在JList上按下箭头键并且所选单元格是列表中的最后一个时,scrollpane会自动滚动。在这里,旧的选定单元格需要重新绘制,因此我们需要一个标志,使视口仅在显式调用setViewPosition(Point)时才执行优化绘制。当通过其他途径调用setBounds时,标志关闭,视图会正常重绘。另一种方法是从JViewport类中删除此内容,并通过使用setBackingStoreEnabledJList管理此情况。默认值为false
    • BLIT_SCROLL_MODE

      public static final int BLIT_SCROLL_MODE
      使用graphics.copyArea来实现滚动。对于大多数应用程序来说,这是最快的方法。
      自:
      1.3
      参见:
    • BACKINGSTORE_SCROLL_MODE

      public static final int BACKINGSTORE_SCROLL_MODE
      将视口内容绘制到离屏图像中。这在以前是JTable的默认模式。在某些情况下,此模式可能比“位块模式”更具优势,但它需要大量额外的RAM。
      自:
      1.3
      另请参见:
    • SIMPLE_SCROLL_MODE

      public static final int SIMPLE_SCROLL_MODE
      此模式使用非常简单的方法,每次滚动时重新绘制滚动窗格的整个内容。这是 Swing 1.0 和 Swing 1.1 的默认行为。在大多数情况下,其他两个选项中的任何一个都将提供更好的性能。
      自:
      1.3
      另请参见:
  • Constructor Details

    • JViewport

      public JViewport()
      创建一个JViewport
  • Method Details

    • getUI

      public ViewportUI getUI()
      返回渲染此组件的 L&F 对象。
      覆盖:
      getUI 在类 JComponent
      返回:
      一个ViewportUI对象
      自:
      1.3
    • setUI

      @BeanProperty(hidden=true, visualUpdate=true, description="The UI object that implements the Component\'s LookAndFeel.") public void setUI(ViewportUI ui)
      设置渲染此组件的 L&F 对象。
      参数:
      ui - ViewportUI L&F 对象
      自:
      1.3
      另请参见:
    • updateUI

      public void updateUI()
      将 UI 属性重置为当前外观的值。
      覆盖:
      updateUI 在类 JComponent
      另请参见:
    • getUIClassID

      public String getUIClassID()
      返回一个指定渲染此组件的 L&F 类的名称的字符串。
      覆盖:
      getUIClassID 在类 JComponent
      返回:
      字符串"ViewportUI"
      另请参见:
    • addImpl

      protected void addImpl(Component child, Object constraints, int index)
      设置JViewport的一个轻量级子组件,可以为null。(由于只有一个占据整个视口的子组件,因此constraintsindex参数将被忽略。)
      覆盖:
      addImpl 在类 Container
      参数:
      child - 视口的轻量级child
      constraints - 要遵守的constraints
      index - 索引
      另请参见:
    • remove

      public void remove(Component child)
      移除Viewport的一个轻量级子组件。
      覆盖:
      remove 在类 Container
      参数:
      child - 要移除的组件
      另请参见:
    • scrollRectToVisible

      public void scrollRectToVisible(Rectangle contentRect)
      滚动视图,使视图中的Rectangle可见。

      如果视图当前无效(isValid返回false),则在滚动之前尝试验证视图。为了避免在创建包含层次结构时进行过多验证,如果祖先之一没有对等体,或者没有验证根祖先,或者其中一个祖先不是WindowApplet,则不会进行验证。

      请注意,此方法不会滚动到有效视口之外;例如,如果contentRect大于视口,则滚动将限制在视口的边界内。

      覆盖:
      scrollRectToVisible 在类 JComponent
      参数:
      contentRect - 要显示的Rectangle
      另请参见:
    • setBorder

      public final void setBorder(Border border)
      视口通过正常的父/子剪切(通常情况下,视图向相反方向移动)来“滚动”其子组件(称为“视图”)。不支持非null边框或非零插图,以防止此组件的几何形状变得复杂到足以阻止子类化。要创建带有边框的JViewport,请将其添加到具有边框的JPanel中。

      注意:如果border为非null,此方法将抛出异常,因为JViewPort不支持边框。

      覆盖:
      setBorder 在类 JComponent
      参数:
      border - 要设置的Border
      抛出:
      IllegalArgumentException - 未实现此方法
      另请参见:
    • getInsets

      public final Insets getInsets()
      返回边框维度(插图)为(0,0,0,0),因为JViewport不支持边框。
      覆盖:
      getInsets 在类 JComponent
      返回:
      一个零尺寸和零原点的Rectangle
      另请参见:
    • getInsets

      @BeanProperty(expert=true) public final Insets getInsets(Insets insets)
      返回包含此JViewport的插图值的Insets对象。传入的Insets对象将被重新初始化,并且此对象中的所有现有值将被覆盖。
      覆盖:
      getInsets 在类 JComponent
      参数:
      insets - 可重用的Insets对象
      返回:
      此视口的插图值
      另请参见:
    • isOptimizedDrawingEnabled

      public boolean isOptimizedDrawingEnabled()
      JViewport覆盖了此方法的默认实现(在JComponent中),以返回false。这确保绘图机制将调用Viewportpaint实现,而不是直接向JViewport的子组件发送消息。
      覆盖:
      isOptimizedDrawingEnabled 在类 JComponent
      返回:
      false
    • isPaintingOrigin

      protected boolean isPaintingOrigin()
      如果滚动模式是BACKINGSTORE_SCROLL_MODE,以使绘制源自JViewport或其祖先之一,则返回true。否则返回false
      覆盖:
      isPaintingOrigin 在类 JComponent
      返回:
      如果滚动模式是BACKINGSTORE_SCROLL_MODE,则返回true。
      另请参见:
    • paint

      public void paint(Graphics g)
      根据backingStore是否启用,通过后备存储器绘制图像或仅绘制最近暴露的部分,使用后备存储器“位块”其余部分。
      术语“blit”是 PDP-10 BLT(BLock Transfer)指令的发音版本,该指令复制了一块位。 (如果你感兴趣的话。)
      覆盖:
      paint 在类中的覆盖 JComponent
      参数:
      g - 用于绘制的Graphics上下文
      参见:
    • reshape

      public void reshape(int x, int y, int w, int h)
      设置此视口的边界。如果视口的宽度或高度已更改,则触发StateChanged事件。
      覆盖:
      reshape 在类中的覆盖 JComponent
      参数:
      x - 原点的左边缘
      y - 原点的顶边缘
      w - 像素宽度
      h - 像素高度
      参见:
    • setScrollMode

      @BeanProperty(bound=false, enumerationValues={"JViewport.BLIT_SCROLL_MODE","JViewport.BACKINGSTORE_SCROLL_MODE","JViewport.SIMPLE_SCROLL_MODE"}, description="Method of moving contents for incremental scrolls.") public void setScrollMode(int mode)
      用于控制滚动视口内容的滚动方法。您可能希望更改此模式以获得最大性能适用于您的用例。
      参数:
      mode - 以下值之一:
      • JViewport.BLIT_SCROLL_MODE
      • JViewport.BACKINGSTORE_SCROLL_MODE
      • JViewport.SIMPLE_SCROLL_MODE
      自:
      1.3
      参见:
    • getScrollMode

      public int getScrollMode()
      返回当前滚动模式。
      返回:
      scrollMode属性
      自:
      1.3
      参见:
    • isBackingStoreEnabled

      @Deprecated public boolean isBackingStoreEnabled()
      Deprecated.
      As of Java 2 platform v1.3, replaced by getScrollMode().
      如果此视口维护其内容的离屏图像,则返回true
      返回:
      如果scrollModeBACKINGSTORE_SCROLL_MODE,则返回true
    • setBackingStoreEnabled

      @Deprecated public void setBackingStoreEnabled(boolean enabled)
      Deprecated.
      As of Java 2 platform v1.3, replaced by setScrollMode().
      如果为真,则此视口将维护其内容的离屏图像。该图像用于减少对viewPosition进行小的一维更改的成本。我们使用Graphics.copyArea而不是重新绘制整个视口来实现一些滚动。
      参数:
      enabled - 如果为真,则维护一个离屏后备存储
    • getView

      public Component getView()
      返回JViewport的一个子级或null
      返回:
      视口的子级,如果不存在则返回null
      参见:
    • setView

      public void setView(Component view)
      设置JViewport的一个轻量级子级(view),可以为null
      参数:
      view - 视口的新轻量级子级
      参见:
    • getViewSize

      public Dimension getViewSize()
      如果视图的大小尚未明确设置,则返回首选大小,否则返回视图的当前大小。如果没有视图,则返回0,0。
      返回:
      指定视图大小的Dimension对象
    • setViewSize

      public void setViewSize(Dimension newSize)
      设置视图的大小。将触发状态更改事件。
      参数:
      newSize - 指定视图的新大小的Dimension对象
    • getViewPosition

      public Point getViewPosition()
      返回出现在视口左上角的视图坐标,如果没有视图则返回0,0。
      返回:
      一个给出左上角坐标的Point对象
    • setViewPosition

      public void setViewPosition(Point p)
      设置出现在视口左上角的视图坐标,如果没有视图则不执行任何操作。
      参数:
      p - 一个给出左上角坐标的Point对象
    • getViewRect

      public Rectangle getViewRect()
      返回一个矩形,其原点为getViewPosition,大小为getExtentSize。这是视图的可见部分,以视图坐标表示。
      返回:
      一个给出视图坐标的可见部分的Rectangle
    • computeBlit

      protected boolean computeBlit(int dx, int dy, Point blitFrom, Point blitTo, Dimension blitSize, Rectangle blitPaint)
      计算一个blit的参数,其中后备存储图像当前包含左上角为oldLoc,我们正在滚动到newLoc。参数被修改以返回所需进行blit的值。
      参数:
      dx - 水平增量
      dy - 垂直增量
      blitFrom - 我们正在从中blit的Point
      blitTo - 我们正在blit到的Point
      blitSize - 要blit的区域的Dimension
      blitPaint - 要blit的区域
      返回:
      如果参数被修改并且我们准备进行blit,则返回true;否则返回false
    • getExtentSize

      public Dimension getExtentSize()
      返回视图坐标中可见部分的大小。
      返回:
      一个给出视图大小的Dimension对象
    • toViewCoordinates

      public Dimension toViewCoordinates(Dimension size)
      将像素坐标中的大小转换为视图坐标。支持“逻辑坐标”的视口子类将覆盖此方法。
      参数:
      size - 使用像素坐标的Dimension对象
      返回:
      转换为视图坐标的Dimension对象
    • toViewCoordinates

      public Point toViewCoordinates(Point p)
      将像素坐标中的点转换为视图坐标。支持“逻辑坐标”的视口子类将覆盖此方法。
      参数:
      p - 使用像素坐标的Point对象
      返回:
      转换为视图坐标的Point对象
    • setExtentSize

      public void setExtentSize(Dimension newExtent)
      使用视图坐标设置视图的可见部分的大小。
      参数:
      newExtent - 指定视图大小的Dimension对象
    • createViewListener

      protected JViewport.ViewListener createViewListener()
      为视图创建一个监听器。
      返回:
      一个ViewListener
    • createLayoutManager

      protected LayoutManager createLayoutManager()
      子类可以覆盖此方法以在构造函数中安装不同的布局管理器(或null)。返回要安装在JViewport上的LayoutManager
      返回:
      一个LayoutManager
    • addChangeListener

      public void addChangeListener(ChangeListener l)
      向列表中添加一个ChangeListener,每当视图的大小、位置或视口的可见大小发生更改时通知。
      参数:
      l - 要添加的ChangeListener
      参见:
    • removeChangeListener

      public void removeChangeListener(ChangeListener l)
      从列表中移除一个ChangeListener,每当视图的大小、位置或视口的可见大小发生更改时通知。
      参数:
      l - 要移除的ChangeListener
      参见:
    • getChangeListeners

      public ChangeListener[] getChangeListeners()
      返回使用addChangeListener()添加到此JViewport的所有ChangeListener的数组。
      返回:
      所有已添加的ChangeListener或如果未添加任何侦听器则返回空数组
      自:
      1.4
    • fireStateChanged

      protected void fireStateChanged()
      当视图的大小、位置或视口的可见大小发生更改时,通知所有ChangeListeners
      参见:
    • repaint

      public void repaint(long tm, int x, int y, int w, int h)
      始终在父坐标系中重新绘制以确保RepaintManager只执行一次绘制。
      覆盖:
      repaint 在类 JComponent
      参数:
      tm - 更新前的最大时间(以毫秒为单位)
      x - x坐标(从左侧开始的像素)
      y - y坐标(从顶部向下的像素)
      w - 宽度
      h - 高度
      参见:
    • paramString

      protected String paramString()
      返回此JViewport的字符串表示形式。此方法仅用于调试目的,返回的字符串的内容和格式可能因实现而异。返回的字符串可能为空,但不会是null
      覆盖:
      paramString 在类 JComponent
      返回:
      JViewport的字符串表示形式
    • firePropertyChange

      protected void firePropertyChange(String propertyName, Object oldValue, Object newValue)
      通知属性更改的侦听器。这是为了更新windowBlit属性而进行子类化的。(putClientProperty属性是final的)。
      覆盖:
      firePropertyChange 在类 Component
      参数:
      propertyName - 包含属性名称的字符串
      oldValue - 属性的旧值
      newValue - 属性的新值
    • getAccessibleContext

      public AccessibleContext getAccessibleContext()
      获取与此JViewport关联的AccessibleContext。对于视口,AccessibleContext采用AccessibleJViewport的形式。如有必要,将创建一个新的AccessibleJViewport实例。
      指定者:
      getAccessibleContext 在接口 Accessible
      覆盖:
      getAccessibleContext 在类 Component
      返回:
      作为此JViewport的AccessibleContext的AccessibleJViewport