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

  • 所显示的摘录是准备运行的小型示例程序的摘录,可以在这里找到: https : //gist.github.com/rherrmann/b1a2a633cd4c9b607fe7

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中变量的值十进制,C语言中介绍的整型变量 即十进制 十六进制什么的是什么意思 能具体解释一下吗 还有换算什么的 谢谢...

二进制.八进制.十进制.十六进制.编程序时不需要换算。输入的时候八进制%o十六进制%x十进制%d在计算机都一样是二进制,不影响计算,不存在转换问题。输出的时候,同理用%o,%d,%x输出相应的进制。(0.56)85*8-16*8-2(0.71875)10(12A)161*1622*161A…

大数相加c语言思路,大数相加

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include /**** 定义双向节点* 数据区为一个整型数字***/struct Node {int number;//数据区,仅一个数字,保存一位数字struct Node * next;struct Node * prev;};typedef struct Node Node;/*** 创建…

关联关系、依赖关系总结

一、关联关系总结: 1.对象和对象之间的连接。在Java中,关联关系的代码表现形式为一个类做为另一个类的属性类型存在。即“有”的关系:”has-a”。 2.关联关系的方向:关联关系分为单向关联和双向关联 ①单向关联: A类…

使用cglib创建代理对象

在上一篇文章中,我讨论了基于标准Java的代理对象。 当您要在实现接口的对象上具有方法调用处理程序时,可以使用这些方法。 Java反射代理的创建要求您具有一个实现接口的对象。 我们要代理的对象已经失控,它没有实现我们要从处理程序调用的接口…

四阶龙格库塔c语言,四阶龙格库塔算法的C语言实现

解微分方程2001年3月焦作大学学报JOURNALOFJIAOZ&a…

8个超震撼的HTML5和纯CSS3动画源码

HTML5和CSS3之所以强大,不仅因为现在大量的浏览器的支持,更是因为它们已经越来越能满足现代开发的需要。Flash在几年之后肯定会消亡,那么HTML5和CSS3将会替代Flash。今天我们要给大家分享8个最新的HTML5和纯CSS3动画及其源码,这些…

c语言打砖块游戏代码,打砖块游戏的源代码(请多指教)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#include#includevoid draw(int x1){int m0,n0,x40,y20;int t0,i,j,k1;int a0,b127,c88;for(i0;i<8;i){ni*20;yn20;for(j0;j<16-t;j){m(ji)*40;xm40;int points[]{m,n,x,n,x,y,m,y}; setfillstyle(R…

git本地创建新分支并推送到远程仓库

1,在当前项目目录&#xff0c;从已有的分支创建新的分支(如从master分支),创建一个dev分支 git checkout -b dev 2,创建完可以查看一下,分支已经切换到dev git branch * dev master 3,提交该分支到远程仓库 git push origin dev 4,测试从远程获取dev git pull origin dev 5,我觉…

javadoc 开源项目_在下一个项目中不使用JavaDoc的5大原因

javadoc 开源项目JavaDoc对于框架和库的开发是绝对必需的&#xff0c;这些框架和库为其他框架&#xff08;例如Spring Framework&#xff0c;JDK&#xff09;提供了公共接口。 对于内部企业软件和/或产品开发&#xff0c;我有以下原因会在将来忽略“ 100&#xff05;JavaDoc Po…

android拍照功能无预览,Android 无预览拍照

最近得到了一个需求&#xff0c;在后台拍照并保存public void onTakePhotoClicked() {final SurfaceView preview new SurfaceView(this);SurfaceHolder holder preview.getHolder();// deprecated setting, but required on Android versions prior to 3.0holder.setType(Su…

vim选中字符复制/剪切/粘贴

问题描述&#xff1a; vim 中选中指定字符&#xff0c;进行复制/剪切/粘贴 问题解决&#xff1a; 进入vim中visual模式&#xff0c;visual模式进入&#xff0c;可以有三种方式&#xff1a; &#xff08;1&#xff09;在普通模式&#xff08;normal&#xff09;下&#xf…

使用JavaFX构建反应系统

JavaFX是用于在Java中构建图形应用程序的新标准库&#xff0c;但是许多程序员仍然对Swing甚至&#xff08;高音&#xff09;AWT感到困惑。 在Java诞生20年来&#xff0c;发生了很多事情。 两年前&#xff0c;当我开始研究Speedment UI的JavaFX库时&#xff0c;发现很多东西很着…

android中访问手机存储空间,android – 访问手机内部存储以推入SQLite数据库文件...

我正在使用Netbeans和java开发我的android应用程序.当我使用模拟器时,我可以通过访问以下路径,data / data / com.example.helloandroid / database来访问File explorer并将SQLite数据库插入设备内部存储器但是当我使用真实设备时,我无法访问此位置以将SQLite文件推送到手机的内…

Spring中@Autowired注解、@Resource注解的区别

Spring不但支持自己定义的Autowired注解&#xff0c;还支持几个由JSR-250规范定义的注解&#xff0c;它们分别是Resource、PostConstruct以及PreDestroy。Resource的作用相当于Autowired&#xff0c;只不过Autowired按byType自动注入&#xff0c;而Resource默认按 byName自动注…

android中白色怎么表示,通知栏图标在android 5中变成白色

接受的答案不完全正确。当然&#xff0c;它会使通知图标显示颜色&#xff0c;但是这样做有一个很大的缺点-将目标SDK设置为比AndroidLolliop低&#xff01;如果您按照建议将目标SDK设置为20来解决您的白色图标问题&#xff0c;您的应用程序将不会针对AndroidLolliop&#xff0c…

Merge Sorted Array

这是一道我觉得有点不是很好的简单题 题目&#xff1a; Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:     You may assume that nums1 has enough space (size that is greater or equal to m n) to hold additi…

阿里巴巴android图标素材网,阿里巴巴矢量图标库

网站简介&#xff1a;IconFont:阿里巴巴矢量图标库是由阿里巴巴体验团队倾力打造的中国第一个最大且功能最全的矢量图标库&#xff0c;提供矢量图标下载、在线存储、格式转换等功能&#xff0c;是设计师和前端开发的便捷工具。IconFont平台是由阿里巴巴UX部门推出的矢量图标管理…

gkz cloud sql_使用Cloud SQL的Google App Engine全文搜索

gkz cloud sql许多Google AppEngine开发人员一直在等待全文搜索功能&#xff0c;特别是来自网络上最大的搜索引擎Google。 我很高兴看到Google团队正在努力&#xff0c;您可以在Google I / O 2011会议上查看&#xff1a;Bo Majewski和Ged Ellis进行的全文本搜索 。 据我所知&am…

poj1419 Graph Coloring 最大独立集(最大团)

最大独立集&#xff1a; 顶点集V中取 K个顶点&#xff0c;其两两间无连接。 最大团&#xff1a; 顶点集V中取 K个顶点&#xff0c;其两两间有边连接。 最大独立集补图的最大团最大团补图的最大独立集 #include<iostream> #include<cstring> #include<cstdio>…

android短信增加条目,Android仿短信条目右上角的红色小圆球提示气泡

可以重写View的onDraw完成该功能&#xff0c;也可以写布局文件完成该功能。现在使用布局文件完成。暂时先简单写一个TextView右上角的提示小红球&#xff0c;也可以根据需要写一个ImageView右上角的小红球提示。android:layout_width"match_parent"android:layout_he…