formlayout
一直在追求效率,最近我重新考虑了SWT FormLayout
的可用性。 尽管就灵活性而言,它是我最喜欢的核心布局之一,但我不得不认识到,大多数同仁都不愿意使用它。 考虑到面部React,建议将其建议用于适当的任务有时实际上会造成真正的身体疼痛……
确实,在仔细检查之后,人们不得不承认这种用法至少有点麻烦。 布局本身与其所覆盖的每个控件的FormData
配置FormData
。 以下代码片段显示了一个简单的用例–好吧,我不会破坏自己发现它的作用的乐趣:
Label label = new Label( composite, SWT.NONE );
FormData labelData = new FormData();
label.setLayoutData( labelData );
labelData.top = new FormAttachment( 0 );
labelData.right = new FormAttachment( 100 );
labelData.bottom = new FormAttachment( 100 );
labelData.left = new FormAttachment( 0 );
当然,每个人都可以弄清楚代码的功能。 但是它确实具有真正解决问题的想法–我想这是问题的一部分。 那么,如何以下面的方式编写这种不太冗长但仍然更具表现力的代码:
Label label = new Label( composite, SWT.NONE );
attach( label ).atTop().atRight().atBottom().atLeft();
尽管它绝对更紧凑,但表达至少在某种程度上在旁观者的眼中,并且在很大程度上取决于人们对当前任务的隐喻。 在我的想象中, FormLayout
基本上将控件边界附加到某些参考点,即顶部atTop ,这意味着它始终将控件的顶部保持在父级客户区域的上限。
或者,它在顶部将一个控件附加到另一个控件,这意味着该控件的上侧始终与另一个控件的底部对齐。 此外,可以将一个边附加到与各自客户区绑定的百分比范围内,所有这些都可以这样表示:
attach( control ).atLeftTo( otherControl ).fromTop( 20 );
基于这种思想,我开发了一个名为FormDatas
实用程序小类,以将概述的思想付诸实践。 该类提供了一个静态方法attach
来创建FormData
的新实例,该实例在作为参数指定的控件处注册。 返回的布局数据实例由FormDatas
对象包装,以启用配置方法1的流畅接口样式。
另外,还有很多方法变体可以处理,例如边距或对齐的概念。 边距基于基础的Attachment#offset
属性,但实际上尊重附件的一面。 因此,5 atRight
的边距对应于已使用分子100分配给FormData#right
属性的Attachment
的偏移量-5:
attach( label ).atRight( 5 );
的缩写
FormData formData = new FormData();
label.setLayoutData( formData );
formData.right = new FormAttachment( 100, -5 );
对齐由Attachment#alignment
属性支持,并使用相应的SWT常量。 例如,要将控件的顶部附件调整到另一个控件的中心,请使用以下代码:
attach( control ).atTopTo( otherControl, MARGIN, SWT.CENTER );
这是另一种情况,显示了如何使用宽度提示而不是相对的侧面附件:
attach( control ).atTop().atRight().atBottom().withWidth( WIDTH );
值得一提的是, FormDatas
实现并未涵盖FormData
和FormAttachment
所有可能性。 但是,由于我能够替换当前项目中的所有用例,因此希望能够满足更常见的用例。
从IDE的角度来看,集成FormDatas
的最佳方法是将其配置为收藏 。 这样,可以通过自动处理静态导入等内容的内容辅助使用FormDatas.attach(Control)
方法。
如果您想自己看看FormDatas
,那么有一个包含实现的GitHub要点 。 但是请记住,我没有花任何时间在文档,参数验证等方面。 在这方面,该实用程序是一个很粗糙的版本,可能会随着时间的推移而发展。
https://gist.github.com/fappel/9867945
要点包含FormDatas
和JUnit测试用例,因为该实现旨在在生产环境中使用,因此应进行测试。
-
FormDatas#attach(Control)
基本上是一种工厂方法。 因此,实际上返回FormDatas
的实例可能看起来有些奇怪。 但是,仅仅为了流利的界面风格而引入一种新类型对我来说也有些奇怪–因此,如果您有更好的主意... ↩
翻译自: https://www.javacodegeeks.com/2014/04/slim-down-swt-formlayout-usage.html
formlayout