模块 java.desktop

类 JViewport

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

public class JViewport extends JComponent implements Accessible
您可以通过它查看基础信息的“视口”或“舷窗”。滚动时,移动的是视口。这就像通过相机的取景器凝视。向上移动取景器会使图片顶部的新事物出现,并丢失底部的事物。

默认情况下,JViewport 是不透明的。要更改此设置,请使用 setOpaque 方法。

NOTE:我们已经实现了一种更快的滚动算法,不需要缓冲区来绘制。该算法的工作原理如下:

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

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

Warning: Swing 不是线程安全的。有关详细信息,请参阅 Swing 的线程策略

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

自从:
1.2
参见:
  • 字段详细信息

    • isViewSizeSet

      protected boolean isViewSizeSet
      确定视口尺寸时为真。默认为假。
    • lastPaintPosition

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

      @Deprecated protected boolean backingStore
      已弃用。
      从 Java 2 平台 v1.3 开始
      当此视口维护其内容的屏幕外图像时为真,以便可以使用快速“bit-blit”操作而不是通过访问视图对象来构造显示来进行一些滚动。默认值为 false
      参见:
    • backingStoreImage

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

      protected boolean scrollUnderway
      scrollUnderway 标志用于 JList 等组件。当在 JList 上按下向下箭头键并且所选单元格是列表中的最后一个时,scrollpane 自动滚动。在这里,旧的选定单元格需要重新绘制,因此我们需要一个标志,使视口仅在显式调用 setViewPosition(Point) 时才进行优化绘制。当通过其他路由调用 setBounds 时,标志关闭并且视图正常重绘。另一种方法是将其从 JViewport 类中删除,并让 JList 通过使用 setBackingStoreEnabled 来管理这种情况。默认值为 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 的默认模式。在某些情况下,这种模式可能比“blit 模式”更有优势,但它需要大量额外的 RAM。
      自从:
      1.3
      参见:
    • SIMPLE_SCROLL_MODE

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

    • JViewport

      public JViewport()
      创建一个 JViewport
  • 方法详情

    • 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 边框或非零insets,以防止此组件的几何形状变得足够复杂以抑制子类化。要创建带边框的 JViewport,请将其添加到带边框的 JPanel

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

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

      public final Insets  getInsets()
      将insets(边框)尺寸返回为 (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 则返回 true 以导致绘画源自 JViewport 或其祖先之一。否则返回 false
      重写:
      isPaintingOrigin 在类 JComponent
      返回:
      如果滚动模式是 BACKINGSTORE_SCROLL_MODE 则为真。
      参见:
    • paint

      public void paint(Graphics  g)
      根据 backingStore 是否启用,要么通过后备存储绘制图像,要么只绘制最近曝光的部分,使用后备存储“blit”其余部分。
      术语“blit”是 PDP-10 BLT(块传输)指令的发音版本,它复制了一个位块。 (如果你好奇的话。)
      重写:
      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()
      已弃用。
      从 Java 2 平台 v1.3 开始,由 getScrollMode() 取代。
      如果此视口正在维护其内容的屏幕外图像,则返回 true
      返回:
      true 如果 scrollModeBACKINGSTORE_SCROLL_MODE
    • setBackingStoreEnabled

      @Deprecated public void setBackingStoreEnabled(boolean enabled)
      已弃用。
      从 Java 2 平台 v1.3 开始,由 setScrollMode() 取代。
      如果此视口将保留其内容的屏幕外图像,则为 true。该图像用于减少对 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 - 我们从中发送的 Point
      blitTo - 我们要传送到的 Point
      blitSize - blit 区域的 Dimension
      blitPaint - blit 区域
      返回:
      如果参数被修改并且我们准备好 blit,则为 true;否则为假
    • 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 )。返回 LayoutManager 以安装在 JViewport 上。
      返回:
      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 属性是最终的)。
      重写:
      firePropertyChange 在类 Component
      参数:
      propertyName - 包含属性名称的字符串
      oldValue - 属性的旧值
      newValue - 属性的新值
    • getAccessibleContext

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