zoukankan      html  css  js  c++  java
  • 【插件开发】—— 5 SWT控件以及布局使用

    前文回顾:

    插件学习篇

    简单的建立插件工程以及模型文件分析

    利用扩展点,开发透视图

    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 }

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

  • 相关阅读:
    springmvc log4j 配置
    intellij idea maven springmvc 环境搭建
    spring,property not found on type
    intellij idea maven 工程生成可执行的jar
    device eth0 does not seem to be present, delaying initialization
    macos ssh host配置及免密登陆
    centos7 搭建 docker 环境
    通过rest接口获取自增id (twitter snowflake算法)
    微信小程序开发体验
    gitbook 制作 beego 参考手册
  • 原文地址:https://www.cnblogs.com/xing901022/p/4093440.html
Copyright © 2011-2022 走看看