【插件开发】—— 5 SWT控件以及布局使用

前文回顾: 1 插件学习篇简单的建立插件工程以及模型文件分析利用扩展点,开发透视图 4 SWT编程须知

  经过前几篇的介绍,多少对SWT又有了一些认识,那么这篇继续来看一下一些控件的组合使用。

  首先是几种简单的控件,Label,Text,Button,Combo这些都是些常用的简单框架,但是为了能够构造出整齐的布局,还是要多花些心思的。

  除了这些简单的控件外,还有点复杂的控件,比如Table和树、选项卡和菜单等等,这里就先不做介绍了。

  为了整个这些控件,经常要使用两个组合控件以及多种布局。

  1 【Group 组】,这个组可以为我们生成一个带有线的框,这样可以把杂乱的控件放到一个规整的容器内。

  2 【Composite 组合控件】,它是为了拼接一些简单的控件,形成具有复杂功能的整合控件。

  比如文件路径的浏览,往往就需要一个文件浏览的按钮,和一个文本框。

  这里先放出一段代码,代码中使用到了简单的布局模型GridLayout(),以及组和组合控件,还有一些简单的控件。形成一个登陆界面,并且单击按钮可以出发响应事件。效果图如下:

登录前:

登陆后:

  实现代码如下:

  1 package com.xingoo.plugin.swttest.test;
  2 
  3 import org.eclipse.swt.SWT;
  4 import org.eclipse.swt.events.SelectionAdapter;
  5 import org.eclipse.swt.events.SelectionEvent;
  6 import org.eclipse.swt.layout.FillLayout;
  7 import org.eclipse.swt.layout.GridData;
  8 import org.eclipse.swt.layout.GridLayout;
  9 import org.eclipse.swt.widgets.Button;
 10 import org.eclipse.swt.widgets.Combo;
 11 import org.eclipse.swt.widgets.Composite;
 12 import org.eclipse.swt.widgets.Group;
 13 import org.eclipse.swt.widgets.Label;
 14 import org.eclipse.swt.widgets.MessageBox;
 15 import org.eclipse.swt.widgets.Shell;
 16 import org.eclipse.swt.widgets.Text;
 17 
 18 import com.xingoo.plugin.swttest.Abstract.AbstractExample;
 19 
 20 public class Test extends AbstractExample{
 21     private Label infoLabel;
 22     private Text usernameText;
 23     private Text passwordText;
 24     private Combo roleCombo;
 25     
 26     public static void main(String[] args) {
 27         new Test().run();
 28     }
 29     public void todo(Shell shell) {
 30         Group testGroup = new Group(shell,SWT.NONE);
 31         testGroup.setText("User Login");
 32         GridLayout layout = new GridLayout();
 33         layout.numColumns = 2;
 34         layout.marginWidth = 30;
 35         layout.marginHeight = 10;
 36         testGroup.setLayout(layout);
 37         testGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 
 38         {
 39             Composite composite = new Composite(testGroup,SWT.NONE);
 40             GridLayout layoutComposite = new GridLayout();
 41             layoutComposite.numColumns = 2;
 42             layoutComposite.marginHeight = 1;
 43             composite.setLayout(layoutComposite);
 44             composite.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,2,2));
 45             
 46             infoLabel = new Label(composite,SWT.NONE);
 47             infoLabel.setText("请输入用户名 密码");
 48             infoLabel.setLayoutData(new GridData(GridData.FILL_BOTH));
 49             infoLabel.setAlignment(SWT.RIGHT);
 50         }
 51         {
 52             Label usernameLabel = new Label(testGroup,SWT.NONE);
 53             usernameLabel.setText("username:");
 54             
 55             usernameText = new Text(testGroup,SWT.BORDER);
 56             usernameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 57         }
 58         {
 59             Label passwordLabel = new Label(testGroup,SWT.NONE);
 60             passwordLabel.setText("password:");
 61             
 62             passwordText = new Text(testGroup,SWT.BORDER | SWT.PASSWORD);
 63             passwordText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 64         }
 65         {
 66             Label roleLabel = new Label(testGroup,SWT.NONE);
 67             roleLabel.setText("role:");
 68             
 69             roleCombo = new Combo(testGroup,SWT.DROP_DOWN);
 70             roleCombo.setItems(new String[]{"Admin","custom"});
 71             roleCombo.select(1);
 72         }
 73         {
 74             new Label(testGroup,SWT.NONE);
 75             
 76             Button rememberPWBtn = new Button(testGroup,SWT.CHECK);
 77             rememberPWBtn.setText("记住密码");
 78         }
 79         {
 80             new Label(testGroup,SWT.NONE);
 81             
 82             Button autoLoginBtn = new Button(testGroup,SWT.CHECK);
 83             autoLoginBtn.setText("自动登录");
 84         }
 85         {
 86             new Label(testGroup,SWT.NONE);
 87             
 88             Button loginBtn = new Button(testGroup,SWT.PUSH);
 89             loginBtn.setText("登录");
 90             
 91             loginBtn.addSelectionListener(new SelectionAdapter() {
 92                 public void widgetSelected(SelectionEvent evt){
 93                     infoLabel.setText("登陆成功");
 94                     
 95                     usernameText.setText("");
 96                     usernameText.setEnabled(false);
 97                     
 98                     passwordText.setText("");
 99                     passwordText.setEnabled(false);
100                     
101                     roleCombo.setEnabled(false);
102                 }
103             });
104         }
105     }
106 }

  注意其中的一些技巧:

30-36行:我们创建了一个组控件,并且使用了网格布局,设置每行有两列。并且设置了组内填充边界,marginWidth以及marginHeight。

39-49行:我们创建了一个组合对象,使他占有了两个列元素。并且设置组内为两列的网格布局。

  关于事件的监听,之后也会搜集整理出一些常用的事件。

  剩下的就比较好理解了,当没有空间元素填补的时候,为了防止布局错乱,创建了一个空的Label对象用来占位。

  new Label(testGroup,SWT.NONE);

  这里面使用到了一个前文提到的抽象类,这里再贴出来一次。

 1 package com.xingoo.plugin.swttest.Abstract;
 2 
 3 import org.eclipse.swt.layout.FillLayout;
 4 import org.eclipse.swt.widgets.Display;
 5 import org.eclipse.swt.widgets.Shell;
 6 
 7 public abstract class AbstractExample{
 8     public void run(){
 9         Display display = new Display();
10         Shell shell = new Shell(display);
11         shell.setText("shell example");
12         shell.setBounds(200,200,400,280);
13         shell.setLayout(new FillLayout());
14         todo(shell);
15         shell.open();
16         
17         while(!shell.isDisposed()){
18             if(!display.readAndDispatch())
19                 display.sleep();
20         }
21         //dispose the resource
22         display.beep();
23         display.dispose();
24     }
25     public abstract void todo(Shell shell);//extension something here
26 }

  后续将会更新,复杂控件以及布局模型的介绍。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android知识点总结

Android材料设计之FloatingActionButton+Snackbar+SheetX3

1033
来自专栏Android干货园

Android自定义组合控件---教你如何自定义下拉刷新和左滑删除

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/80...

1901
来自专栏developerHaoz 的安卓之旅

Android 打造一个丝滑的自动轮播控件

现在很多的 App 都有自动轮播的 banner 界面,用于展示广告图片或者显示当前比较热门的一些活动,除了具备比较酷炫的效果之外,通过轮播的方式来减少对界面的...

1362
来自专栏Android开发指南

3.复杂的viewpager

3909
来自专栏程序员的诗和远方

看代码学AndroidUI - Tab

最近慢慢学习一点安卓,先看了些基础的,还处于很初级的阶段,平常都是面对弱类型的语言,python,js,现在看java突然有点不适应。 这里推荐郭神的《第一行代...

3349
来自专栏非著名程序员

Android手势研究(textview及listview对比验证)

手势即手触摸屏幕做出动作。 View可以通过onTouchEvent收到触摸屏幕事件, 我们可以通过View.setOnTouchListener()设...

2177
来自专栏androidBlog

自定义 Behavior - 仿新浪微博发现页的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

1412
来自专栏Android干货园

Android源码解析--SwipeMenuListView仿QQ聊天左滑

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/50...

1431
来自专栏向治洪

gradeview可拖动效果实现

下面先上这次实现功能的效果图:(注:这个效果图没有拖拽的时候移动动画,DEMO里面有,可以下载看看) ? 一、开发心里历程 刚开始接触这个的时候,不知道要如何实...

3488
来自专栏指尖下的Android

Matisse预览图片黑屏,Glide内存溢出

项目中要到图片、视频选择的功能,然后google了一下,找到Matisse,知乎的图片选择框架,用的人还挺多的,果断依赖gradle,然后开始我的踩坑之旅。 ...

2451

扫码关注云+社区

领取腾讯云代金券