`
冷漠过客
  • 浏览: 5582 次
社区版块
存档分类
最新评论

SWT 自定义布局

阅读更多

在上篇文章中我们介绍了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的子类,谢谢大家

 

  • 大小: 5.2 KB
  • 大小: 3.4 KB
  • 大小: 4.3 KB
分享到:
评论

相关推荐

    SWT(JFace)体验之模拟BorderLayout布局

    SWT中没有AWT的BorderLayout布局管理器。下面是SWT下的自定义实现: BorderLayout.java 代码如下:package swt_jface.demo2; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org....

    SWT开发组件demo

    本包包含基础组件的demo及属性介绍,扩展组件,自定义组件,滚动条,分割线,分组、布局、选项卡等以及高级组件的应用demo

    Eclipse_Swt_Jface_核心应用_部分19

    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 监听...

    SWT Generic Enhancements-开源

    自定义实现 os SWT 小部件以添加特定的缺失功能,通常包含在小部件中,但不公开。 对小部件内容的布局和显示提供更精细的控制。 某些功能的增强

    WindowBuilder

    一款基于Eclipse SWT技术上的双向Java Gui设计bai软件,使得SWT和Swing很容易创建 Java GUI 的应用程序 , 而无需花费很多时间来编写代码。使用可视化设计器和布局工具来创建简单的Windows窗体。可以使用添加控件...

    JAVA程序开发大全---上半部分

    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 第...

    java基础案例与开发详解案例源码全

    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 ...

    Eclipse RCP Plugin 开发自学入门指南(CEC首发)

    5.2 添加自定义视图 ......................................................................................................................... 47 5.3 向VIEW里添加ACTION ....................................

    java源码包---java 源码 大量 实例

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    java源码包2

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML...

    java源码包3

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML...

    java源码包4

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    JAVA上百实例源码以及开源项目

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    JAVA上百实例源码以及开源项目源代码

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    Eclipse RCP Plug-in开发自学教程(Eclipse3.6)

    5.2 添加自定义视图 .........................................................................................................................47 5.3 向VIEW里添加ACTION .....................................

Global site tag (gtag.js) - Google Analytics