SWT ScrolledComposite解释

就像我的一个朋友曾经说过的那样,SWT的ScrolledComposite是令人讨厌的野兽。 在某种程度上,我同意。 这可能是为什么有太多关于如何使用此小部件的问题的原因。

但不仅是ScrolledComposite的作者受到了谴责。 当某个软件无法按您预期的方式工作时,则……您诅咒……并尝试一些不同的尝试……并以不同的方式诅咒……并向Google寻求帮助……并(希望)找到这个可爱的小文章。 哪个告诉您:RTFM! – ups,嗯,我的意思是当然看看文档。

而且,如果您阅读JavaDoc,您将了解有两种使用ScrolledComposite的方法,并查看了相应的示例代码。

二合一

第一种方法适用于固定大小的内容,如果无法完全看到所包含的控件,将显示滚动条,否则将其隐藏。

另外,如果进行了相应的设置,则ScrolledComposite会模仿浏览器的工作方式。 内容将随着ScrolledComposite的大小而增长和缩小–直到可见区域小于指定的最小大小。 在后一种情况下,将显示滚动条,并且内容绝不会减少到最小大小以下。

该视频并排显示了不同的操作模式:

在左侧,当窗口放大时内容的大小保持不变,并且在不再需要滚动条时消失。 但是,在右侧,初始窗口大小小于指定的最小大小,因此会出现滚动条。 随着窗口变大,内容也随窗口增长。

滚动固定内容

设置ScrolledComposite以显示固定内容非常简单:

scrolledComposite = new ScrolledComposite( parent, SWT.H_SCROLL | SWT.V_SCROLL );
Label label = new Label( scrolledComposite, SWT.NONE );
label.setBackground( display.getSystemColor( SWT.COLOR_DARK_GREEN ) );
label.setSize( 400, 400 );
scrolledComposite.setContent( label );

请注意,您需要显式指定H_SCROLLV_SCROLL样式标志。 否则,将不会创建任何滚动条,并且ScrolledComposite几乎没有用( 稍后会在滚动条上更多介绍 )。

代码段的另一个值得注意的部分是在其中创建内容的地方-这里是一个400 x 400像素的绿色标签。 内容的父级必须是ScrolledComposite本身。 如果没有,您会看到有趣的结果。 最后,必须告知ScrolledComposite应该使用setContent()管理的内容。

该示例演示了最简单的情况,其中内容是单个控件。 但是,如果要滚动的内容包含多个控件,则需要将它们包装到具有适当布局的Composite中,如联系详细信息示例中所示。

在此上下文中,固定大小的内容并不表示该内容必须或不能更改其大小。 如果发生这种情况,则ScrolledComposite将适应新的大小,并相应地显示或隐藏滚动条。 但是,如果调整ScrolledComposite的大小,则内容不会更改其大小。

滚动扩展内容

通过添加几行,可以扩展上述代码片段以扩展其内容:

scrolledComposite.setExpandHorizontal( true );
scrolledComposite.setExpandVertical( true );
scrolledComposite.setMinSize( 250, 250 );

之后,ScrolledComposite会在调整大小时扩展内容,并且仅在滚动条的大小减小到小于最小大小时才显示滚动条。 SWT API提供了进一步的方法来设置最小大小。 通过setMinWidth()和setMinHeight()或setMinSize(Point)分别确定最小宽度和高度。

扩展内容时,将最小大小设置为零(默认值)是合法的。 结果,内容将缩小而没有下限,并且永远不会显示滚动条。

这是ScrolledComposite的两种基本模式:管理固定大小的内容或扩展和减少内容。

仅垂直滚动

我遇到的另一个用例是有一个未知长度的项目清单。 考虑一下冗长的联系方式表单,其中包含多行,每行包括一个标签和一个输入字段。 每行的宽度占用的空间尽可能多,但是如果行数超过可用高度,则该数字应该是可滚动的。

稍作调整,即可将上面显示的扩展ScrolledComposite扩展为仅垂直滚动。 此处的关键是动态设置最小大小。 每当ScrolledComposite更改其大小时,内容的最小宽度将设置为ScrolledComposite的可用宽度。

实现所描述行为的代码非常简单:

scrollComposite.addListener( SWT.Resize, event -> {
  int width = scrollComposite.getClientArea().width;
  scrollComposite.setMinSize( parent.computeSize( width, SWT.DEFAULT ) );
} );

调整大小的侦听器使用getClientArea()查询ScrolledComposite的可用空间
并根据给定的客户区域宽度计算内容的必要大小。 最后,将结果大小设置为ScrolledComposite的最小大小。

在此示例中,内容的外观由两列布局控制。 标签列的宽度足以显示最长的标签,而输入字段列则使用剩余的宽度。 每行依次使用最佳高度(即显示单行输入字段所需的高度)。

即使我还没有看到实际的用例,但这种方法在水平扩展时也可以使用。

计算ScrolledComposite的首选大小

没有比看到应用程序设计时考虑到单个屏幕分辨率,字体大小或配色方案(或全部)更令人难过的了。 为避免这种情况,联系人详细信息表单使用自适应策略来计算其初始大小。

由于内容由重复项组成(此处标记为输入字段),因此将单个项目的大小作为度量单位。 这里的项目数是从证据中获得的数字,但在其他情况下,也可能是从数据源获得的(有限)行数。

公式本身很简单:

numberOfItems = 10
initialHeight = numberOfItems * ( itemHeight + spacing )

进一步的改进将是对照屏幕尺寸检查最终的高度,并在必要时减小其高度。

生成的布局可在不同平台,屏幕分辨率和字体设置之间很好地缩放。 如果这引起了您的兴趣,您可能还想阅读Eclipse和SWT的响应式UI

垂直和水平滚动条

要掌握滚动条,请分别使用getVerticalBar()和getHorizo​​ntalBar()。 如片段中所示,需要指定V_SCROLL和H_SCROLL样式标志才能创建垂直和/或水平滚动条。 如果省略了相应的样式标志,则不会创建任何滚动条,并且getVerticalBar()或getHorizo​​ntalBar()将返回null。

但是,可以随时显示或隐藏,启用或禁用现有滚动条。 默认情况下,ScrolledComposite仅在必要时显示滚动条,但可以使用setAlwaysShowScrollBars()将此行为更改为始终显示滚动条。 因此,通常需要同时创建两个滚动条,并让ScrolledComposite决定何时显示或隐藏单个条。

通常,请注意,滚动条由ScrolledComposite管理。 因此,查询它们的状态是安全的,但是操纵属性很可能会干扰ScrolledComposite的事物视图。

若要更改滚动条的位置以使内容的某些部分可见,请使用下面讨论的指定方法。

上述唯一的例外可能是滚动条的启用状态。 如果确实希望这样做,则可以安全地调用setEnabled()。

滚动到视图

ScrolledComposite有几种更改滚动条位置的方法。 最基本的是setOrigin()。 滚动内容控件,以使内容中的指定点位于左上角。 所需位置可以指定为单独的x和y坐标,也可以指定为点。 因此,有一个getOrigin()方法可返回当前显示在左上角的点。

为了给客户节省一些坐标映射,有一个showControl(),它建立在setOrigin()上并滚动内容以便可见给定的控件。

如果焦点控件始终可见,则可以通过setShowFocusedControl()建议ScrolledComposite自动将焦点控件滚动到视图中。

总结SWT ScrolledComposite

实际上,ScrolledComposite并不是SWT集合中最直观的小部件,我希望这里介绍的食谱将有助于更好地与之相处。 这里讨论的用例是到目前为止我所遇到的用例。 但是,我想知道进一步的用途,如果您想分享您的意见,请发表评论。

最后但并非最不重要的一点是,我想指出的是,此处显示的所有概念和代码不仅适用于SWT,而且在具有Eclipse RAP的浏览器中同样运行良好。 您甚至可以使用此RAP在线演示更改各种标志和属性,并立即查看其效果。

翻译自: https://www.javacodegeeks.com/2016/03/swt-scrolledcomposite-explained.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 SWT ScrolledComposite 的 addListener() 方法的详细注释: ```java // 创建 ScrolledComposite 实例 ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL); // 添加监听器,当视图被打开时触发 scrolledComposite.addListener(SWT.Activate, new Listener() { @Override public void handleEvent(Event event) { // 在此处添加要执行的代码 // ... } }); // 设置 ScrolledComposite 的大小 scrolledComposite.setMinSize(width, height); // 创建一个子组件并将其添加到 ScrolledCompositeComposite content = new Composite(scrolledComposite, SWT.NONE); scrolledComposite.setContent(content); // 设置子组件的布局 content.setLayout(new GridLayout(numColumns, true)); ``` 在上述代码中,我们创建了一个 ScrolledComposite 实例,并将其添加到父组件中。然后,我们添加了一个监听器,该监听器会在视图被打开时触发,而不是在 ScrolledComposite 被创建时触发。在监听器的处理方法中,我们可以添加要执行的代码,例如加载数据、刷新 UI 界面等等。 接下来,我们设置 ScrolledComposite 的大小,并创建一个子组件并将其添加到 ScrolledComposite 中。最后,我们设置子组件的布局,以便它可以正确地显示在 ScrolledComposite 中。 需要注意的是,ScrolledComposite 只会在需要滚动时才会显示滚动条。如果子组件的大小没有超过 ScrolledComposite 的大小,则不会显示滚动条。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值