在上篇文章中我们介绍了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的子类,谢谢大家
相关推荐
SWT中没有AWT的BorderLayout布局管理器。下面是SWT下的自定义实现: BorderLayout.java 代码如下:package swt_jface.demo2; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org....
本包包含基础组件的demo及属性介绍,扩展组件,自定义组件,滚动条,分割线,分组、布局、选项卡等以及高级组件的应用demo
7.7.3 自定义布局类(BorderLayout) 119 7.8 使用VE可视化布局 123 7.8.1 创建可视化的类 123 7.8.2 进行布局设置 124 7.9 本章小结 125 第8章 SWT中的事件模型 126 8.1 事件模型概述 126 8.1.1 监听...
自定义实现 os SWT 小部件以添加特定的缺失功能,通常包含在小部件中,但不公开。 对小部件内容的布局和显示提供更精细的控制。 某些功能的增强
一款基于Eclipse SWT技术上的双向Java Gui设计bai软件,使得SWT和Swing很容易创建 Java GUI 的应用程序 , 而无需花费很多时间来编写代码。使用可视化设计器和布局工具来创建简单的Windows窗体。可以使用添加控件...
17.4 SWT中的布局管理器 302 17.4.1 RowLayout布局管理器 302 17.4.2 FillLayout布局管理器 304 17.4.3 GridLayout布局管理器 305 17.4.4 FormLayout布局管理器 308 17.5 SWT中的事件模型 309 17.6 本章小结 313 第...
14.1.2 布局管理器359 14.2 事件处理机制365 14.2.1 事件监听器366 14.2.2 事件适配器(EventAdapter)370 14.3 AWT常用组件372 14.3.1 界面组件372 14.3.2 菜单组件377 14.3.3 其他组件382 14.4 Swing简介383 14.4.1 ...
5.2 添加自定义视图 ......................................................................................................................... 47 5.3 向VIEW里添加ACTION ....................................
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML...
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML...
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML...
日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...
Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...
5.2 添加自定义视图 .........................................................................................................................47 5.3 向VIEW里添加ACTION .....................................