在上篇文章中我们介绍了swt的四大布局,通过代码我们可以发现4种布局都是继承与一个Layout抽象父类,那我们是不是可以自己通过继承Layout写一个属于自己的布局呢,答案是肯定, 下面我来介绍一个自己写布局,BorderLayout 此布局一次至多现实5个子控件,分别指定,top bottom left right center control 来完成布局下面是其源码
public class BorderLayout extends Layout { public int marginWidth = 0; public int marginHeight = 0; public Control topControl; public Control bottomControl; public Control rightControl; public Control leftControl; public Control centerControl; Point computeSize (Control control, boolean flushCache) { int wHint = SWT.DEFAULT, hHint = SWT.DEFAULT; return control.computeSize (wHint, hHint, flushCache); } @Override protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { int topHeight=0; int bottomHeight=0; int centerHeight=0; int leftWidth=0; int centerWidth=0; int rightWidth=0; if(topControl!=null){ Point size = computeSize(topControl, flushCache); topHeight=size.y; centerWidth=Math.max(size.x, centerWidth); } if(centerControl!=null){ Point size= computeSize(centerControl, flushCache); centerHeight=Math.max(size.y,centerHeight); centerWidth=Math.max(size.x, centerWidth); } if(leftControl!=null){ Point size= computeSize(leftControl, flushCache); centerHeight=Math.max(size.y,centerHeight); leftWidth=size.x; } if(rightControl!=null){ Point size= computeSize(rightControl, flushCache); centerHeight=Math.max(size.y,centerHeight); rightWidth=size.x; } if(bottomControl!=null){ Point size= computeSize(bottomControl, flushCache); bottomHeight=size.y; centerWidth=Math.max(size.x, centerWidth); } int height=topHeight+centerHeight+bottomHeight+2 * marginWidth; int width=leftWidth+centerWidth+rightWidth+2 * marginHeight; if (wHint != SWT.DEFAULT) width = wHint; if (hHint != SWT.DEFAULT) height = hHint; return new Point(width, height); } @Override protected boolean flushCache(Control control) { // TODO Auto-generated method stub return true; } @Override protected void layout(Composite composite, boolean flushCache) { Rectangle rect = composite.getClientArea(); rect.x += marginWidth; rect.y += marginHeight; rect.width -= 2 * marginWidth; rect.height -= 2 * marginHeight; if(topControl!=null){ Point size = computeSize(topControl, flushCache); Rectangle top_rect=new Rectangle(rect.x+(rect.width-size.x)/2 ,rect.y, size.x,size.y); topControl.setBounds(top_rect); } if(centerControl!=null){ Point size= computeSize(centerControl, flushCache); Rectangle center_rect=new Rectangle(rect.x+(rect.width-size.x)/2 ,rect.y+(rect.height-size.y)/2, size.x,size.y); centerControl.setBounds(center_rect); } if(leftControl!=null){ Point size= computeSize(leftControl, flushCache); Rectangle left_rect=new Rectangle(rect.x ,rect.y+(rect.height-size.y)/2, size.x,size.y); leftControl.setBounds(left_rect); } if(rightControl!=null){ Point size= computeSize(rightControl, flushCache); Rectangle right_rect=new Rectangle(rect.x+rect.width-size.x ,rect.y+(rect.height-size.y)/2, size.x,size.y); rightControl.setBounds(right_rect); } if(bottomControl!=null){ Point size= computeSize(bottomControl, flushCache); Rectangle bottom_rect=new Rectangle(rect.x+(rect.width-size.x)/2 ,rect.y+(rect.height-size.y), size.x,size.y); bottomControl.setBounds(bottom_rect); } } }
在下面是其应用代码:
BorderLayout bl=new BorderLayout(); shell.setLayout(bl); Button top_b=new Button(shell,SWT.PUSH); top_b.setText("top"); bl.topControl=top_b; Button bottom_b=new Button(shell,SWT.PUSH); bottom_b.setText("bottom"); bl.bottomControl=bottom_b; Button left_b=new Button(shell,SWT.PUSH); left_b.setText("left"); bl.leftControl=left_b; Button right_b=new Button(shell,SWT.PUSH); right_b.setText("right"); bl.rightControl=right_b; Button center_b=new Button(shell,SWT.PUSH); center_b.setText("center"); bl.centerControl=center_b;
接下来是其UI效果图
其实在swt库中,还有很多其他layout只是用的比较少,现在我在为大家介绍一种我在实际情况中用的比较多的一个:StackLayout
此布局一次只能显示一个子控件,通过它的一个属性topControl 用此我们可以做一个类似卡片一样的控件,通过点击它显示的子控件,来更换控件,下面是具体代码:
StackLayout sl=new StackLayout(); shell.setLayout(sl); for(int i=0;i<5;i++){ Button b=new Button(shell,SWT.PUSH); b.setText("button"+i); b.setData(i); if(i==0){ sl.topControl=b; } b.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { // TODO Auto-generated method stub for(Control c:shell.getChildren()){ int index=(int) b.getData(); if(index<4){ index++; if(index==(int)c.getData()){ sl.topControl=c; shell.layout(); break; } }else{ if(0==(int)c.getData()){ sl.topControl=c; shell.layout(); break; } } } } @Override public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); }
窗口刚打开效果如图:
按钮点击一下的效果如下,以此类推
想要知道更多swt库中以后的布局,可以查询Layout的子类,谢谢大家
相关推荐
Java SWT(Standard Widget ...总之,Java SWT自定义控件为开发者提供了创造独特用户界面的强大工具。通过理解控件的基本原理、绘图机制、事件处理和布局管理,我们可以创建出满足特定需求的、富有吸引力的界面元素。
### SWT 自定义控件开发详解 #### 背景与需求 随着基于Eclipse平台的应用程序日益增多,开发者越来越依赖于SWT/JFace等提供的工具包来构建丰富的用户界面。然而,这些内置组件库虽然提供了大量的基础控件,但在特定...
本资源“SWT.rar_swt自定义组件”是一个关于如何在Eclipse中利用SWT来创建自定义控件的学习资料,特别适合初学者探索和实践。 1. SWT基础:SWT是Eclipse基金会维护的一个项目,它提供了一系列的类和接口,用于构建...
不过,开发者可以通过自定义布局或结合其他布局来实现类似的功能。 使用布局管理器时,开发者需要注意以下几点: 1. **布局属性**:每个布局都有自己的属性,例如网格布局的`marginWidth`和`marginHeight`,可以...
标题中的“java swt jface 自定义UI主题 / GUI界面”指的是使用这两个库来创建具有个性化外观和感觉的用户界面。自定义UI主题通常是通过改变控件的颜色、字体、布局以及其他视觉元素来实现的,从而让应用看起来更...
3. **处理布局管理**:自定义组件通常需要考虑如何与SWT的布局系统配合,以适应不同的窗口大小和位置。 4. **实现事件处理**:根据组件的功能,添加或扩展事件处理机制,使组件能够响应用户的交互。 5. **测试与...
此外,SWT还支持事件处理、布局管理以及对话框等特性,使得开发者可以方便地构建复杂的用户界面。 为了在64位Java环境中使用这个库,开发人员需要确保他们的Java开发环境(JDK)也是64位的,因为32位的JDK无法识别...
SWT(Standard Widget Toolkit)是Java中用于构建图形用户界面(GUI)的库,它提供了丰富的控件和功能。在SWT中,布局管理器是一...同时,根据应用的需求,还可以自定义布局管理器或者组合使用多种布局来达到预期效果。
2. 自定义布局:如果预设布局无法满足需求,可以自定义布局类继承自`Layout`,实现特定的布局策略。 四、监听机制 1. 事件监听:SWT中的事件包括按钮点击、键盘输入、鼠标移动等,通过实现相关监听器接口并添加到...
4. **可扩展性**: SWT允许开发者创建自定义控件,通过组合现有Widget实现新的功能。 5. **兼容性**: SWT支持多种操作系统,如Windows、Linux、macOS等,为跨平台开发提供了便利。 **使用SWT进行开发** 1. **初始...
本资源包含的"Sample Code"可能是各种基于SWT的实例代码,这些代码涵盖了SWT的各种组件、布局管理、事件处理、对话框、拖放操作、打印、剪贴板支持等高级主题。通过这些源码,我们可以学习到以下关键知识点: 1. **...
通常,控件会包含一个主类,该类实现了SWT的Widget接口,可以作为一个控件添加到 SWT 的布局中。此外,可能还有其他的辅助类和样式表文件(.css)来支持控件的外观和行为。 在实际应用中,你可以通过实例化这个...
3. **布局管理**:SWT提供了多种布局管理器,如 FillLayout、GridLayout、MigLayout 等,用来控制组件在容器中的位置和大小。开发者可以根据需求选择合适的布局管理器来实现界面的美观和逻辑清晰。 4. **原生接口**...
9. **SWT与Eclipse IDE**:由于SWT是Eclipse的基础,因此如果你对SWT有深入了解,将有助于在Eclipse环境中进行开发和自定义插件。 综合这个压缩包中的练习,开发者可以通过运行和分析代码,了解Swing和SWT在实际...
- **用户体验**:提供自定义布局、拖放支持,以及更直观的窗口管理功能。 - **多平台兼容性**:SWT 是跨平台的,但不同的操作系统可能有不同的 UI 风格,确保在不同平台上具有良好的一致性。 - **错误处理和异常管理...
9. SWT布局管理:SWT提供了几种布局管理器,如FillLayout、GridLayout、FormLayout等,用于控制组件在容器中的排列方式。正确使用布局管理器可以确保界面在不同分辨率和屏幕尺寸下都能良好显示。 10. SWT国际化与...
通常,这样的内容会涵盖如何创建、布局、事件处理以及自定义SWT Form组件等方面的知识。 在标签中,“源码”意味着讨论可能涉及到了SWT库的内部实现,或者提供了使用SWT的代码示例。“工具”可能指的是SWT作为开发...
此外,它也支持自定义控件和复杂的布局结构,使开发者能够构建功能丰富的桌面应用。 总的来说,SWT Designer 提供了一个强大的可视化工具,使得使用 SWT 开发 Java 桌面应用程序变得更加直观和高效。通过学习和熟练...
SWT提供了几种布局管理器,如FillLayout、GridLayout、FormLayout等,用于控制组件在容器中的排列方式和大小调整。 5. SWT与JFace JFace是建立在SWT之上的抽象层,简化了SWT的使用,提供了一些高级组件,如对话框...
6. **打印支持**:SWT提供了打印框架,可以用来创建自定义的打印任务,例如在Word教程中可能会涉及文本或富文本的打印功能。 7. **SWT与JFace的结合**:JFace是基于SWT的一个高级界面库,提供了更多抽象和便利的...