1. Widget
所有Window组件的基类,包含了最基本的组件方法:处理事件、关闭并释放资源、数据存取等。
2. Control
继承自Widget,是大部分基本组件的基类,除了ScrollBar和Menu。
3. Button(Composite parent, int style)
类型有:SWT.PUSH(按钮)、SWT.CHECK(复选框)、SWT.TOGGLE(凹凸切换按钮)、SWT.RADIO(单选按钮)、SWT.FLAT(平滑按钮)、SWT.ARROW(箭头按钮,与SWT.LEFT/SWT.DOWN等组合使用可设定箭头方向)。
4. Label(Composite parent, int style)
当style为SWT.SEPARATOR时显示一个图形的分隔符,同时还有SWT.WRAP(文字可换行)、SWT.BORDER(带边框)、SWT.HORIZONTAL(水平分隔)、SWT.VERTICAL(垂直分隔)。
5. Text(Composite parent, int style)
类型有:SWT.SINGLE(单行文本框)、SWT.MULTI(多行文本框)、SWT.READ_ONLY(只读文本框)、SWT.V_SCROLL(垂直滚动)、SWT.H_SCROLL(水平滚动)。
6. Combo(Composite parent, int style)
类型有:SWT.DROP_DOWN(带下拉框按钮)、SWT.SIMPLE(无下拉按钮)、SWT.READ_ONLY(只读下拉)。
7. List(Composite parent, int style)
类型有:SWT.SINGLE(单选列表框)、SWT.MULTI(多选列表框)、SWT.V_SCROLL(垂直滚动)、SWT.H_SCROLL(水平滚动)、SWT.BORDER(带边框)。
1. 实现MouseListener接口来响应鼠标的按下、松开、双击事件
● mouseDoubleClick 鼠标双击事件响应
● mouseDown 鼠标键按下事件响应
● mouseUp 鼠标键起来事件响应
2. 实现MouseMoveListener接口响应鼠标的移动事件
● mouseMove 鼠标移动事件
3. 实现MouseTrackListener接口响应鼠标进入窗口、退出窗口、停放窗口上的事件
● mouseEnter 鼠标进入窗口事件响应
● mouseExit 鼠标退出窗口事件响应
● mouseHover 鼠标停放窗口事件响应
1. 实现KeyListener接口来响应键盘键按下和松开事件
● keyPressed 键盘键按下事件响应
● keyReleased 键盘键松开事件响应
1. 实现FocusListener接口响应获得焦点和失去焦点的事件
● focusGained 组件获得焦点事件响应
● focusLost 组件失去焦点事件的响应
1. 实现ControlListener接口来响应组件被移动或改变大小事件
● controlMoved 组件被移动事件响应
● controlResized 组件被改变大小事件响应
1. 实现SelectionListener接口响应选择组件事件
● widgetSelected 组件被选择事件响应
● widgetDefaultSelected 组件默认选择事件响应
1. 实现HelpListener接口响应用户帮助事件,当用户在组件获得焦点后按【F1】键触发
● helpRequested 组件帮助事件响应
2. 实现VerifyListener接口响应效验输入事件,目前只对文本输入效验,通过VerifyEvent中的doit属性判断输入是否正确
● verifyText(VerifyEvent e) 文本输入效验事件响应
3. 实现ModifyListener接口响应文本被修改的事件,目前只对文本输入效验
● modifyText 文件被修改事件响应
4. 如果VerifyListener和ModifyListener同时存在,会先响应效验输入事件,如果效验成功再响应修改事件。
一般来说,监听器都有一个抽象的Adaper类实现监听器方法,如FocusAdaper实现了FocusListener的方法,如不想实现监听器的全部方法可以继承监听器的Adaper类。
1. 它会以同样大小对父组件中的子组件进行布局,这些子组件将以一行或一列形式排列
2. SWT.HORIZONTAL是水平方向放置组件,SWT.VERTICAL是垂直方向放置组件
1. 子组件将在父组件上一行或几行显示(设置相应属性值,子组件会自动换行)
2. 通过RowLayout.属性方式设置RowLayout的布局风格,具体常见属性如下
● Wrap 子组件是否可以换行(true为可换行)
● Pack 子组件是否为保持原有大小(true为保持原有大小)
● Justify 子组件是否根据父组件信息做调整
● MarginLeft 子组件距父组件左边距像素
● MarginTop 子组件距父组件上边距像素
● MarginRight 子组件距父组件右边距像素
● MarginBottom 子组件距父组件下边距像素
● Spacing 子组件之间的间距像素
● RowData 设置子组件的大小,button.setLayoutData(new RowData(60,60))
1. GridLayout是网格布局,它把父组件分成一个表格,默认情况下每个子组件占据一个单元格的空间,每个子组件按添加到父组件的顺序排列
2. GridLayout布局提供了GridData类,子组件可以设置相应的GridData,GridData可以设置每个组件当单元格的信息
3. numColumns 设置父组件中分几列显示子组件
4. makeColumnsEqualWidth 设置父组件是否有相同的列宽
5. GridData.horizontalAlignment 设置子组件水平对齐方式
6. GridData.verticalAlignment 设置子组件垂直对齐方式
7. GridData.horizontalIndent 设置子组件水平偏移像素
8. GridData.horizontalSpan 设置子组件水平占据几个网格
9. GridData.verticalSpan 设置子组件垂直占据几个网格
10. grabExcessHorizontalSpace 当父组件大小变化时,子组件是否以水平方式抢占空间
11. grabExcessVerticalSpace 当父组件大小变化时,子组件是否以垂直方式抢占空间
12. 每个GridData都必须有单独的实例,几个子组件不能共用同一个GridData(即使有相同的属性)
1. 通过FormAttachment以父组件或子组件的边作为相对位置,进行精确布局
2. marginLeft 当前组件距离父组件左边距像素
3. marginRight 当前组件距离父组件右边距像素
4. marginTop 当前组件距离父组件上边距像素
5. marginBottom 当前组件距离父组件下边距像素
6. FormData.top 指定子组件的上面边的FormAttachment,formData.Top = New FormAttachment()
7. FormData.bottom 指定子组件的下面边的FormAttachment
8. FormData.left 指定子组件的左面边的FormAttachment
9. FormData.right 指定子组件右面边的FormAttachment
10. FormAttachement构造函数常用的三个参数
● numerator 相对于组件的百分比
● offset 相对于组件的偏移量
● control 组件(如果未指定则默认为父组件)
1. 通过继承Layout抽象类完成自定义布局
● computeSize抽象方法 负责计算组件所有子组件使占的高度和宽度,并返回一个Point类型的变量(width,height)
● layout抽象方法 负责计算子组件的大小和位置,并按计算出来的位置排列子组件
1. 它的作用相当于一个容器面板,用户可以创建一个面板对象,通过面板对象添加子组件
Composite composite = new Composite(shell, SWT.BORDER); composite.setLayout(new RowLayout(SWT.VERTICAL)); new Button(composite, SWT.RADIO).setText("wangwei");
1. 该组件代表分组框,用户可以通过分组框把内容上相关的子组件组合在一起
Group group = new Group(shell, SWT.SHADOW_IN); group.setLayout(new RowLayout(SWT.VERTICAL)); group.setText("simple group"); new Button(group, SWT.RADIO).setText("wangwei") Group group_2 = new Group(shell, SWT.SHADOW_IN); group_2.setLayout(new RowLayout(SWT.VERTICAL)); group_2.setText("simple group 2"); new Button(group_2, SWT.RADIO).setText("othername");
1. 通过使用TabFolder组织分页框,TabItem为每一个分页组成Tab页组件
● 在容器中创建一个TabFolder对象,如TabFolder tabFolder = new TabFolder(shell, SWT.BORDER)
● 在TabFolder中创建一个TabItem对象,如TabItem tabItem = new TabItem(tabFolder, SWT.NULL)
● 设置TabItem的显示标签,如tabItem.setText("simple tab one")
● 设置每一个分页的Control对象(即在此页的顶层组件,一般是容器),如tabItem.setControl(composite)
TabFolder tabFolder = new TabFolder(shell, SWT.BORDER); for(int loopIndex = 0; loopIndex < 3; loopIndex++){ TabItem tabItem = new TabItem(tabFolder, SWT.NULL); tabItem.setText("Tab" + loopIndex); Composite composite = new Composite(tabFolder, SWT.BORDER); tabItem.setControl(composite); } tabFolder.setSize(100, 100);
1. SWT中的分隔框组件,在容器中,有时需要调整容器中元素的大小,这就要用到SashForm组件
● 在容器中创建一个SashForm对象,如SashForm sashForm = new SashForm(shell, SWT.HORIZONTAL)
● 在SashForm对象中添加分隔项(即分隔框的子组件),可以是SashForm和Control的子类,如Text text = new Text(sashForm, SWT.CENTER)
● 设置SashForm中分隔项显示比例的权重,如sashForm.setWeights(new int[]{1,2,3}),表示3个分隔项之间的显示比例为1:2:3
SashForm sashForm = new SashForm(shell, SWT.HORIZONTAL); Text text = new Text(sashForm, SWT.CENTER); text.setText("text pane #1"); Text text_2 = new Text(sashForm, SWT.CENTER); text_2.setText("text pane #2"); sashForm.setWeights(new int[]{1,1});
1. SWT中通过Menu和MenuItem实现菜单和菜单项
● 创建Menu对象,并指定创建的风格,如Menu menu = new Menu(shell, SWT.BAR)
● 创建MenuItem对象,并指定创建的风格,如MenuItem menuItem = new MenuItem(menu, SWT.RADIO)
● 设置Menu和MenuItem的关联(Menu中还可以有子Menu),如fileMenuHeader.setMenu(fileMenu)
● 添加MenuItem的事件监听器,如fileItem.addSelectionListener(new RadioItemListeren())
Menu menuBar = new Menu(shell, SWT.BAR);//添加主菜单项 MenuItem fileMenuHeader = new MenuItem(menuBar, SWT.CASCADE);//添加一级子菜单 fileMenuHeader.setText("&File"); Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);//添加一级子菜单的菜单项 fileMenuHeader.setMenu(fileMenu); MenuItem fileSaveItem = new MenuItem(fileMenu, SWT.PUSH); fileSaveItem.setText("&Save"); MenuItem fileEnglishItem = new MenuItem(fileMenu, SWT.RADIO); fileEnglishItem.setText("English"); fileSaveItem.addSelectionListener(new MenuItemListener()); fileEnglishItem.addSelectionListener(new RadioItemListener());
1. SWT中通过Toolbar和ToolItem实现工具栏和工具栏项
● 创建ToolBar对象,并指定创建的风格,如ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.WRAP | SWT.RIGHT)
● 创建ToolItem对象,并指定创建的风格,如ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH)
● 设置ToolItem的图标和相关属性,如toolItem.setImage(icon)
● 添加ToolItem的事件监听器,如toolItem.addListener(SWT.Selection, selectionListener)
ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.WRAP | SWT.RIGHT); ToolItem itemPush = new ToolItem(toolBar, SWT.PUSH); itemPush.setText("Push Item"); itemPush.addListener(SWT.Selection, selectionListener); Listener selectionListener = new Listener(){ public void handleEvent(Event evnet){ ToolItem item = (ToolItem)event.widget; System.out.println(item.getText() + "is selected"); if((item.getStyle() & SWT.RADIO)!=0 || (item.getStyle() & SWT.CHECK)!=0){ System.out.println("Selection status:" + item.getSelection()) } } };
1. CoolBar是另外一中形式的工具栏,它能够调整CoolItem的位置,每一个CoolItem可以设定相关的组件
● 创建CoolBar对象,并指定创建的风格,如CoolBar composite = new CoolBar(parent, SWT.NONE)
● 创建CoolItem对象,并指定创建风格,如CoolItem item = new CoolItem(composite, SWT.NONE)
● 设置CoolItem的Control对象,如item.setControl(tb)
● CoolBar相当于一个面板容器,CoolItem是容器中的每一项,CoolItem能设置相应的组件作为此项的子容器
1. 用户通过Slider设置数据的增量值,用来控制其他组件,也可以作为滚动条控制其他组件的数据显示
● 创建Slider对象,并指定创建风格,如Slider slider = new Slider(shell, SWT.HORIZONTAL)
● 设置Slider的最大值和最小值,如slider.setMaximum(100)
● 设置Slider增量的增加或递减值,如slider.setIncrement(1)
● 添加Slider的事件监听器,如slider.addSelectionListener(selectionListener)
● Scale组件和Slider类似,在SWT中都表示一中尺度,但两者的表现形式不一样,Scale更像一个刻度,而Slider则是提供一个滚动条
1. ProgressBar是SWT中的进度条组件,进度条提供比较长时间操作的进度信息
● 创建ProgressBar对象,并指定创建的风格,如ProgressBar progressBar = new ProgressBar(shell, SWT.HORIZONTAL | SWT.SMOOTH)
● 设置ProgressBar的最大值和最小值,如progressBar.setMaximum(30)
● 在长时间的任务中设置当前进度条的进度,如progressBar.setSelection(progressBar.getSelection() + 1)
● 为了配合长时间的任务,进度条经常配合线程使用
ProgressBar pb1 = new ProgressBar(shell, SWT.HORIZONTAL | SWT.SMOOTH); pb1.setMinimum(0); pb1.setMaximum(30); ProgressBar pb2 = new ProgressBar(shell, SWT.HORIZONTAL | SWT.INDETERMINATE); new LongRunningOperation(display, pb1).strar();//添加线程,在线程中处理长时间任务 Class LongRunningOperation extends Thread{ public void run(){ for(int i = 0; i < 30; i++){ Thread.sleep(1000); pb1.setSelection(pb1.getSelection() + 1); } } };
1. 使用TreeViewer来表示一棵树,TreeViewer功能比较强,它能定义节点、节点的显示标签、响应事件和显示图标信息
● TreeViewer中主要通过内容提供器(ITreeContentProvider)和标签提供器(ILabelProvider)组织树节点的内容和显示的信息
● 创建TreeViewer对象,如TreeViewer treeView = new TreeViewer(composite)
● 设定内容提供器,如treeView.setContentProvider(new FileTreeContentProvider())
● 设定标签提供器,如treeView.setLabelProvider(new FileTreeLabelProvider())
● 设定TreeViewer的输入数据,如treeView.setInput("root") 即用户可以通过输入数据构建树
2. 使用ITreeContentProvider构建树中比较复杂的部分,它为树的显示提供了内容
● getElements
此方法定义为public Object[] getElements(Object inputElement),当程序开始构建树时,首先调用getElements返回一个对象数组,此数组对象表示当前树的根节点,inputElement参数为TreeViewer的输入(setInput的输入数据)
● hasChildren
此方法定义为public boolean hasChildren(Object element),当TreeViewer显示一个节点后,会调用hasChildren方法判断当前节点是否有子节点,如果有子节点则显示"+",element参数为要判断是否有子节点的节点
● getChildren
此方法定义为public Object[] getChildren(Object parentElement),当用户选择节点打开子节点时,会调用getChildren方法返回下一层子节点,parentElement参数为选择的节点
● getParent
此方法定义为public Object getParent(Object element),可以通过此方法返回element的父节点
● inputChanged
此方法定义为public void inputChanaged(Viewer viewer, Object oldInput, Object newInput),当输入改变时调用此方法
● dispose
此方法定义为public void dispose(), 当树销毁时被调用
● 用户通过重写这几个方法构建一棵树,通过getElements方法得到根,再通过hasChildren判断根下是否有子节点,如果有子节点,可以通过getChildren得到所有的子节点
3. 使用ILabelProvider来显示节点的相关信息,包括显示内容和图标
● ILabelProvider主要实现getImage和getText方法,当TreeViewer得到一个节点后会通过getText得到此节点的显示文本,通过getImage方法得到节点的显示图标
1. 使用TableViewer来表示表格,通过使用内容提供器(IStructuredContentProvider)和标签提供器(ITableLabelProvider)组织表格的信息
● 创建TableViewer对象,如TableViewer tableView = new TableViewer(table),其中table是SWT中Table对象
● 设定内容提供器,如tableView.setContentProvider(contentProvider)
● 设定标签提供器,如tableView.setLabelProvider(lableProvider)
● 设定TableViewer的输入数据,如tableView.setInput("root") 即用户可以通过输入数据构建表
● 用户可以添加排序器和过滤器对表格数据进行排序和过滤
2. TableViewer中内容提供器(IStructuredContentProvider)比较简单,用户可以通过实现getElements返回表格的所有数据
● getElements
此方法定义为public Object[] getElements(Object inputElement),返回Object[]对象数组,其中数组中的每一个对象代表表格的一列,当TableViewer输入数据后,其将根据输入数据构建表格对象数据
3. TableViewer中标签提供器(ITableLabelProvider)主要负责每个单元格中文本和图标的显示
● getColumnText
此方法定义为public String getColumnText(Object element, int columnIndex),返回指定单元格的显示文本,其中element表示单元格所在行的对象,columnIndex表示单元格所在的列
● getColumnImage
此方法定义为public Image getColumnImage(Object element, int columnIndex),返回指定单元格的显示图标,其中element表示单元格所在行的对象,columnIndex表示单元格所在的列
1. 使用ListViewer管理列表,通过使用内容提供器(IStructuredContentProvider)和标签提供器(ILabelProvider)组织列表信息
● StructuredViewer基类
● setSorter
此方法定义为public void setSorter(ViewSorter sorter),用户可以通过setSorter设置Viewer的排序器,当然通过getSorter得到排序器
● addFilter
此方法定义为public void addFilter(ViewerFilter filter),用户可以通过addFilter添加过滤器,在Viewer中过滤器可以同时有多个,可以通过getFilters得到过滤器列表
● getSelection
此方法定义为public ISelection getSelection(),返回选择节点对象,用户可以通过ISelection得到当前选择的对象
1. MessageDialog通过openConfirm方法打开确认对话框,如MessageDialog.openConfirm(shell, "Confirm", text.getText())
2. MessageDialog通过openError方法打开错误对话框,如MessageDialog.openError(shell, "Error", text.getText())
3. MessageDialog通过openInformation方法打开提示信息对话框,如MessageDialog.openInformation(shell, "Error", text.getText())
4. MessageDialog通过openQuestion方法打开提问对话框,如MessageDialog.openQuestion(shell, "Question", text.getText())
5. MessageDialog通过openWarning方法打开警告对话框,如MessageDialog.openWarning(shell, "Warning", text.getText())
6. 上述方法中的参数都是一样的,第一个参数表示父窗口组件,第二个参数表示标题信息,第三个参数表示显示的信息
7. openConfirm方法返回的boolean值,表示用户是否选择确认;openQuestion方法返回boolean值,表示是否正确
1. InputDialog构造函数:public InputDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue, IInputValidator validator)
● parentShell 表示输入框的父窗口
● dialogTitle 表示输入框的标题
● dialogMessage 表示输入框的提示信息
● initialValue 表示初始输入框的值
● validator 表示输入框的校验器
● 效验器是一个IInputValidator类型的对象(也可以是空),校验器中要实现isValid方法,该方法返回一个String类型的值或null,返回值为String类型时为错误的提示信息,如果为null表示效验正确
1. 创建进度条监视对话框要创建一个ProgressMonitorDialog实例,如 new ProgressMonitorDialog(shell)
2. 要运行需要调用run方法,其定义为public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException
● fork 表示当进度对话框运行时,是否刷新界面
● cancelable 表示对话框是否可以取消
● runnable 表示进度处理线程
● 通过实现IRunnableWithProgress接口的run()方法对进度监控对话框中的进度条进行控制
● monitor.beginTask方法表示进度监控对话框开始执行,第一个参数为进度监视对话框的提示信息,第二个参数为把进度分成几份
● monitor.worked方法表示进度每次完成多少份(进度条会相应增加)
● monitor.done方法表示进度监视对话框结束
1. 要自定义对话框,可以通过继承Dialog实现,也可以通过Dialog的子类实现,如TitleAreaDialog(带标题区域对话框)
● createContents 重写了Dialog的createContents方法,把对话框区域分成标题区域和对话框区域
● createTitleArea 建立标题区域的组件
● createDialogArea 建立对话框区域的组件
● setTitle 设置显示的标题
● setMessage 设置显示的信息
● setErrorMessage 设置显示的错误信息
1. 新建打印对话框通过PrintDialog,如PrintDialog printDialog = new PrintDialog(s, SWT.NONE),要打印相关的数据可以通过Printer对象
ColorDialog dlg = new ColorDialog(shell); dlg.setRGB(colorLabel.getBackground().getRGB());//设置默认的颜色 dlg.setText("Choose a Color"); RGB rgb = dlg.open();//打开对话框 if(rgb!=null){ color.dispose(); color = new Color(shell.getDisplay(), rgb); colorLabel.setBackground(color);//设置标签的颜色 }
FontDialog dlg = new FontDialog(shell); //设置初始字体和颜色 if(font != null){ dlg.setFontList(fontLabel.getFont().getFontData()); } if(color != null){ dlg.setRGB(color.getRGB()); } //打开对话框 if(dlg.open() != null){ if(font != null) font.dispose(); if(color != null) color.dispose(); font = new Font(shell.getDisplay(), dig.getFontList());//新建字体对象 fontLabel.setFont(font);//设置标签的字体 color = new Color(shell.getDisplay(), dlg.getRGB());//新建颜色对象 fontLable.setForeground(color);//设置标签颜色 }
FileDialog fd = new FileDialog(s, SWT.OPEN); fd.setText("open");//设置文件对话框的标题 fd.setFilterPath("C:/");//设置初始路径 String[] filterExt = {"*.txt", "*.doc"};//设置扩展名过滤 fd.setFilterExtensions(filterExt); String selected = fd.open();//打开文件对话框,返回选择的文件 System.out.println(selected);
DirectoryDialog dlg = new DirectoryDialog(shell); dlg.setFilterPath(text.getText());//设置初始路径 dlg.setText("SWT DircetoryDialog"); dlg.setMessage("Select a dircetory");//设置提示信息 String dir = dlg.open();//打开对话框,返回目录 if(dir != null){ text.setText(dir); }
1. 鼠标拖放涉及到两个操作,即鼠标的拖和放,这需要实现源和目的的两种类型的组件,以及拖放源和拖放目标
● 创建拖放源组件(即以哪一个组件作为拖放的起始组件),Control类的所有子类都可以作为拖放源组件
● 创建拖放源,并把创建的拖放源组件作为拖放的起始组件,如DragSource ds = new DragSource(tree, DND,DROP_MOVE)
● 设置拖放数据类型,如拖放文本类型ds.setTransfer(new Transfer[]{TextTransfer.getInstance()})
● 为拖放源添加监听事件,如ds.addDragListener(new DragSourceAdapter())
● 创建拖放目标组件,Control类的所有子类可以作为拖放目标组件
● 创建拖放目标,并把新建的组件作为拖放的目标组件,如DropTarget dt = new DropTarget(button, DND.DROP_MOVE);
● 设置拖放数据类型,如拖放文本类型dt.setTransfer(new Transfer[]{TextTransfer.getInstance()})
● 为拖放目标添加监听事件,如dt.addDropListener(new DropTargetAdapter())
1. 线程异步是指多线程同时并发,多个线程同时运行时,每个线程的执行顺序是不确定的,通过线程异步执行,操作系统能够更好的利用时间片,从而获得更高的效率
2. 线程同步是指多个线程同时存在时,线程的执行顺序是确定的,多个线程访问资源时,由于执行顺序确定,不会产生数据不同步的情况
3. 在SWT中,Display通过syncExec和asyncExec提供了同步和异步的机制,从而实现同步和异步方式调用线程
1. 在SWT中提供了Clipboard对象对剪贴板进行封装,Clipboard能把数据保存在剪贴板上,还能够获得剪贴板的数据
● 创建剪贴板对象,如Clipboard cb = new Clipboard(display)
● 得到类型转换器实例,并设置数据到剪贴板中,如cb.setContents(data, TextTransfer.getInstance())
● 得到类型转换器实例,并从剪贴板取出数据,如String string = (String)cb.getContents(TextTransfer.getInstance())
● TextTransfer.getInstance()是文本类型转换器的实例,因为Java是跨平台语言,每中类型的操作系统对数据类型和剪贴板的定义都不一样,所以剪贴板中还要设置类型转换器
1. 在SWT中,GC代表图形上下文,它能在Drawable的对象上操作绘图区域,GC中提供了很多方法,可以直接在Drawable对象上画图,另外当使用完GC后,一定要调用GC.dispose()释放操作系统分配的GC资源
Canvas canvas = new Canvas(shell, SWT.NONE); canvas.setSize(150, 150); canvas.setLocation(20, 20); shell.open(); shell.setSize(200, 200); GC gc = new GC(canvas);//新建GC对象 gc.drawRectangle(10, 10, 40, 45);//调用画图方法画矩形 gc.dispose();
1. 自定义组件的绘制,通常用户需要自己对组件的形状或图案进行绘制
2. 组件对键盘事件的响应,当焦点进入组件,用户进行键盘操作,通过键盘对组件进行控制时,需要让组件对用户的操作进行响应
3. 组件对鼠标事件的响应,当用户使用鼠标选中组件进行操作时,组件必须做出相应的反映
4. 组件对焦点事件的响应,当界面焦点进入或移出组件,通常需要将组件绘制成得到或失去焦点的形状
5. 提供事件监听机制,使用组件时通常需要监听组件中发送的一些事件,这样当事件发送时,组件能进行相应处理