开发Eclipse自定义SWT控件

致远表单函数自定义-groovy代码:阿拉伯数字转大写汉字 在致远表单设计中,为实现将阿拉伯数字转为大写汉字,通过参考大神的算法和致远表单设计方法,需要在控件中的计算方法用到函数自定义,将算法以groovy语言实现出来 阅读详情

 


2005 年 9 月

现在基于Eclipse的应用越来越多,很多桌面应用都是用Eclipse开发的。Eclipse提供了一套SWT/JFACE的控件库,使得人们开发界面应用极大的方便。但是,SWT/JFACE的控件库毕竟有限,在应用开发是我们不可避免地要自己开发一些自定义的控件。本文通过开发一个颜色列表控件的实例介绍了Eclipse自定义控件开发中所要用到的技术。

目标读者必须熟悉Java开发,并且有一定的Eclipse开发经验。

在Eclipse网站上有一篇相关的文章"Creating Your Own Widgets using SWT",该文介绍了开发自己控件的很多基本概念、方法,并且通过实例进行了介绍,非常好。但是其所用的实例比较简单,还有很多控件开发中所要涉及到的内容,例如键盘、鼠标事件的处理,滚动条、焦点的处理等等没有提及。本文通过开发一个自定义的颜色列表控件的实例,全面地介绍了自定义控件所涉及的技术。同时,读者也可以对该实例进行扩展,实现自己的列表控件。

SWT中提供的标准列表控件非常简单,只能提供字符串的选择。我们经常需要提供一些图形列表供用户选择,这就需要自己开发自定义的列表控件。颜色选择列表是我们常用的一种图形列表,我们就以此为例进行介绍。以下是我们将要开发的颜色列表。

我们在开发自定义控件时主要考虑以下问题:

1、 自定义控件的绘制:通常我们需要自己对控件的形状或图案进行绘制;

2、 控件对键盘事件的响应:当焦点进入控件,用户进行键盘操作,通过键盘对控件进行控制时,我们需要让控件对用户的操作进行响应。例如在列表中,用户会通过上下箭头改变列表的选择项;

3、 控件对鼠标事件的响应:当用户用鼠标选中控件,进行操作时,控件必须作出相应的反应;

4、 控件对焦点事件的响应:当界面焦点进入或移出控件,通常我们需要将控件绘制成得到或失去焦点的形状。例如,当焦点进入列表时,一般被选中的列表项会有虚框表示选中。

5、 响应TAB键:对于一个可操纵的控件,用户可以用TAB键将焦点移入或移出。

6、 响应滚动条事件:当控件有滚动条时,我们需要响应用户对滚动条的操作,完成对控件的绘制工作。

7、 提供事件监听机制:程序员使用你的控件时通常需要监听控件中发生的一些事件,这样当事件发生时,他们能够进行相应处理。

8、 提供辅助功能(Accessibility):辅助功能是方便残障人士使用时必须的,标准控件都会提供相应的支持,我们自定义的控件也不例外。

9、 提供功能接口方便程序员访问:通常为方便程序员使用时获取控件中的信息或进行设置,我们需要提供一些接口。

首先我们要开发的列表控件是一个基本控件,所以我们选择Canvas作为我们开发的基类。

 


 public class ColorList extends Canvas { Vector colors = new Vector(); // 用于保存我们颜色控件中的颜色值 Vector colorNames = new Vector(); // 用于保存颜色控件中的颜色名字 int rowSel = -1; // 用于保存当前选中的行号 int oldRowSel = -1; // 用于保存上一次选中的行号 int maxX, maxY; // 用于保存列表的宽度和高度 int lineHeight; // 用于设置行高 int cx = 0; // 滚动条滚动后,控件的图形相对于控件可见区域左上角的x坐标 int cy = 0; // 滚动条滚动后,控件的图形相对于控件可见区域左上角的y坐标 }
 

 


控件开发最重要的就是控件的绘制了。控件的绘制可以通过添加PaintListener,在它的paintControl方法中进行。

 


 addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { GC gc = e.gc; Point size = getSize(); int beginx = e.x; int beginy = (e.y / lineHeight) * lineHeight; int beginLine = (e.y - cy) / lineHeight; int endLine = beginLine + e.height / lineHeight + 1; if (endLine > getItemCount()) endLine = getItemCount(); for (int i = beginLine; i < endLine; i++) { boolean selected = false; if (i == rowSel) selected = true; onPaint(gc, i, cx, beginy + (i - beginLine) * lineHeight, selected); } } });
 

 


这里要注意的是从PaintEvent中获取的x,y,height,width是需要重绘的区域,x,y是以控件的左上角为原点的坐标。在我们的程序中,为了性能起见,我们先根据需要重绘的区域计算出需要重绘的行数,只重绘相应的行,而不是将整个控件重绘。我们程序中用到的onPaint用于绘制一行。

接下来,我们要让我们的控件响应键盘上下键对列表项进行选择。我们已对向上键的处理为例,首先当用户按了向上键时,我们需要改变选择,并且重绘旧的和新的选择项。如果选择项已经到了列表的顶部,我们还需要同时滚动滚动条。

 


 addListener(SWT.KeyDown, new Listener() { public void handleEvent(Event event) { switch (event.keyCode) { case SWT.ARROW_UP: // 处理向上键 if (rowSel != 0) { oldRowSel = rowSel; rowSel--; if (oldRowSel != rowSel) { //发送消息让控件重绘 ((Canvas) event.widget).redraw(cx, (rowSel + cy / lineHeight) * lineHeight, maxX, lineHeight*2, false); } if (rowSel < -cy / lineHeight) { //如果需要,滚动滚动条 ScrollBar bar = ((Canvas) event.widget) .getVerticalBar(); bar.setSelection(bar.getSelection() - lineHeight); scrollVertical(bar); } selectionChanged(); // 发送selectionChanged事件 } break; case SWT.ARROW_DOWN: // down arror key … break; } } });
 

 


接下来,我们要让我们的控件响应鼠标对列表项进行选择。首先我们要计算出鼠标选中的行号,注意MouseEvent中的y值只是相对于控件左上角的坐标,我们需要加上滚动出了控件的部分。

 


 addMouseListener(new MouseListener() { public void mouseDoubleClick(MouseEvent e) { } public void mouseDown(MouseEvent e) { int row = (e.y - cy) / lineHeight; //计算选中的行 if (row >= 0) { oldRowSel = rowSel; rowSel = row; } if (oldRowSel != rowSel) { // 重画旧的和新的选择项 ((Canvas) e.getSource()).redraw(cx, (e.y / lineHeight) * lineHeight, maxX, lineHeight, false); ((Canvas) e.getSource()).redraw(cx, (oldRowSel + cy / lineHeight) * lineHeight, maxX, lineHeight, false); } selectionChanged(); } public void mouseUp(MouseEvent e) { } });
 

 


当我们的控件获得焦点时,选中的列表项需要有虚框表示控件得到焦点。当获得或失去焦点是,我们这里只需要简单的通知选中的项重画。

 


 addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { ((Canvas) e.getSource()).redraw(cx, rowSel * lineHeight, maxX, lineHeight, true); } public void focusLost(FocusEvent e) { ((Canvas) e.getSource()).redraw(cx, rowSel * lineHeight, maxX, lineHeight, true); } });
 

 


我们在绘制每一个列表项时可以加入判断当前控件是否得到焦点,如果控件得到了焦点,我们就在选中的项目上画一个虚框。下面是我们绘制一个列表项的代码,注意在代码的最后绘制焦点的虚框。

 


 void onPaint(GC gc, int row, int beginx, int beginy, boolean isSelected) { Color initColor = gc.getBackground(); Color initForeColor = gc.getForeground(); if (isSelected) { gc.setBackground(Display.getCurrent().getSystemColor( SWT.COLOR_LIST_SELECTION)); gc.fillRectangle(beginx, beginy, maxX, lineHeight); gc.setForeground(Display.getCurrent().getSystemColor( SWT.COLOR_LIST_SELECTION_TEXT)); } else { gc.setBackground(initColor); } gc.drawString((String) colorNames.get(row), beginx + 24, beginy); Color color = Display.getCurrent().getSystemColor( ((Integer) colors.get(row)).intValue()); gc.setBackground(color); gc.fillRectangle(beginx + 2, beginy + 2, 20, lineHeight - 4); gc.setBackground(initColor); gc.setForeground(initForeColor); if (isFocusControl() && isSelected) gc.drawFocus(cx, beginy, maxX, lineHeight); }
 

 


作为一个可操作的控件,TAB键的支持也是很重要的。由于我们的控件是从Canvas继承过来的,不支持TAB键。下面的代码使我们的控件有TAB键的支持:

 


 addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { e.doit = true; } }; });
 

 


很多时候,我们需要有滚动条的支持。对于滚动条,我们只要在上面加上selectionListener,处理它的widgetSelected事件就可以。

 


 bar = getVerticalBar(); if (bar != null) { bar.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { scrollVertical((ScrollBar) event.widget); } }); }
 

 


下面是函数scrollVertical的代码。一旦用户对滚动条操作,我们就可以计算出要滚动的区域,然后调用scroll函数。对函数scroll函数的调用会导致相应区域的重绘。

 


 void scrollVertical(ScrollBar scrollBar) { Rectangle bounds = getClientArea(); int y = -scrollBar.getSelection(); if (y + maxY < bounds.height) { y = bounds.height - maxY; } if( y%lineHeight !=0 ) y = y - y % lineHeight - lineHeight; scroll(cx, y, cx, cy, maxX, maxY, false); cy = y; }
 

 


现在我们的程序已经基本成形了,我们来进一步完善它。由于我们开发的控件是提供给程序员的,我们需要提供接口,让外部知道控件中发生的事件。其中最重要的是列表项的选中事件。我们需要提供接口让程序员能够添加事件监控器(listener)来监控发生的事件,并且一旦发生事件,我们需要通知监控器。

首先,我们添加一个成员来保存添加的事件监控器:

 


 Vector selectionListeners = new Vector();
 

 


我们再增加一个函数addSelectionListener,让程序员可以添加监控器

 


 public void addSelectionListener(SelectionListener listener) { selectionListeners.addElement(listener); }
 

 


在我们前面的代码中,我们注意到每次选择项改变,我们都会调用selectionChanged函数。下面是selectionChanged函数代码。这里,我们会生成一个SelectionEvent事件,并且逐个调用事件监控器的widgetSelected方法。这样别人就可以监听到我们的事件了。

 


 public void selectionChanged() { Event event = new Event(); event.widget = this; SelectionEvent e = new SelectionEvent(event); for (int i = 0; i < selectionListeners.size(); i++) { SelectionListener listener = (SelectionListener) selectionListeners.elementAt(i); listener.widgetSelected(e); } }
 

 


现在辅助功能(Accessibility)也日益成为软件重要的部分,它是的残疾人也能够方便的使用我们的软件。美国已经立法,不符合Accessibility规范的软件不能够在政府部门销售。我们开发的控件也需要支持Accessibility.下面的代码使我们的控件有Accessibility支持。其中最重要的是getRole和getValue函数。我们的控件是从Canvas继承,我们在getRole函数中返回ACC.ROLE_LIST,这样我们的控件才能让屏幕阅读软件将我们的控件作为列表控件对待。

Accessible accessible = getAccessible(); accessible.addAccessibleControlListener(new AccessibleControlAdapter() { public void getRole(AccessibleControlEvent e) { int role = 0; int childID = e.childID; if (childID == ACC.CHILDID_SELF) { role = ACC.ROLE_LIST; } else if (childID >= 0 && childID < colors.size()) { role = ACC.ROLE_LISTITEM; } e.detail = role; } public void getValue(AccessibleControlEvent e){ int childID = e.childID; if (childID == ACC.CHILDID_SELF) { e.result = getText(); } else if (childID >= 0 && childID < colors.size()) { e.result = (String)colorNames.get(childID); } } public void getChildAtPoint(AccessibleControlEvent e) { Point testPoint = toControl(new Point(e.x, e.y)); int childID = ACC.CHILDID_NONE; childID = (testPoint.y - cy)/lineHeight; if (childID == ACC.CHILDID_NONE) { Rectangle location = getBounds(); location.height = location.height - getClientArea().height; if (location.contains(testPoint)) { childID = ACC.CHILDID_SELF; } } e.childID = childID; } public void getLocation(AccessibleControlEvent e) { Rectangle location = null; int childID = e.childID; if (childID == ACC.CHILDID_SELF) { location = getBounds(); } if (childID >= 0 && childID < colors.size()) { location = new Rectangle(cx,childID*lineHeight+cy,maxX,lineHeight); } if (location != null) { Point pt = toDisplay(new Point(location.x, location.y)); e.x = pt.x; e.y = pt.y; e.width = location.width; e.height = location.height; } } public void getChildCount(AccessibleControlEvent e) { e.detail = colors.size(); } public void getState(AccessibleControlEvent e) { int state = 0; int childID = e.childID; if (childID == ACC.CHILDID_SELF) { state = ACC.STATE_NORMAL; } else if (childID >= 0 && childID < colors.size()) { state = ACC.STATE_SELECTABLE; if (isFocusControl()) { state |= ACC.STATE_FOCUSABLE; } if (rowSel == childID) { state |= ACC.STATE_SELECTED; if (isFocusControl()) { state |= ACC.STATE_FOCUSED; } } } e.detail = state; } });

最后,我们需要提供一些方法方便程序员使用我们的控件。

 


 public void setSelection(int index) { if (index >= getItemCount() || index < 0) return; oldRowSel = rowSel; rowSel = index; selectionChanged(); } public int getSelectionIndex() { return rowSel; } public int getItemHeight() { return lineHeight; } public void setItemHeight(int height) { lineHeight = height; } public int getItemCount() { return colors.size(); } public void add(int colorIndex, String colorName) { colorNames.add(colorName); colors.add(new Integer(colorIndex)); }
 

 


我们开发的控件的使用也是非常简单的。

 


 CustomList customlist = new CustomList( parent, SWT.V_SCROLL | SWT.H_SCROLL ); customlist.add(SWT.COLOR_BLACK,"BLACK"); customlist.add(SWT.COLOR_BLUE,"BLUE"); customlist.setSelection(1); customlist.setSize(400,400); customlist.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
 

 


以上我们介绍了如何开发一个简单的自定义控件所需要涉及的技术。这里我们只以一个简单的颜色控件为例,但是一旦我们掌握了方法,我们很容易就可以开发出各种不同的漂亮控件。

整个程序完整的代码清参考:ColorList.java。

 

 

 


RSA在IBM DeveloperWorks上的主页:http://www-128.ibm.com/developerworks/rational/products/rsa/

 

MDA:http://www.omg.org/mda

 

UML:http://www.omg.org/technology/uml/index.htm

 

Eclipse:http://www.eclipse.org

 

Eclipse SWT&JFace开发实战精解源代码 SWT(Standard Widget Toolkit)是Eclipse平台的核心UI框架,它为Java开发者提供了一种创建跨平台桌面应用程序的方法。SWT设计哲学是利用本地操作系统的原生控件来实现图形用户界面,这意味着它能够在不同的操作系统上展现本地界面风格和性能。SWT允许开发者根据需要自定义和扩展窗口小部件。开发者可以通过继承现有的小部件并添加新的方法或属性来扩展功能。 阅读详情

相关推荐

Eclipse SWT与JFace图形界面编程精进

本文还有配套的精品资源,点击获取 简介:SWT和JFace是Eclipse平台中用于构建图形用户界面的重要组件。SWT提供了与操作系统交互的底层API,实现了高效的性能和原生界面外观,而JFace则建立在SWT之上,简化了GUI开发并引入了MVC设计模式。掌握这些工具将使开发者能够创建具有原生用户体验和复杂界面需求的应用程序,同时提高代码的可维护性和可扩展性。通过学习SWT...

weixin_42581846的博客 1724

简单的自定义控件

很炫酷自定义控件的一个网址:https://github.com/Trinea/android-open-project 概念:Android 中组件必须是View的直接子类或间接的子类,其中View有一个ViewGroup的子类,用于定义容器(FrameLayout,LinearLayout,都是ViewGroup的子类) 如果组件中还有子组件,就是从ViewGroup类继承,否则从

hongzhan_li的博客 360

java swt自定义控件

java swt自定义控件java swt自定义控件java swt自定义控件java swt自定义控件

自定义的SWT控件

效果图: 为了在SWT中实现像Windows桌面图标那样的效果,自定义了一个控件,该控件继承自org.eclipse.swt.widgets.Composite,由一个缩略图标(CLabel)和一个图标名称(Label)构成。缩略图是由图片文件提供,并缩放到固定尺寸。创建该控件需要向其构造函数传递一个Image和String,分别是缩略图的原图和即将在图标下方显示的名称。控件的代码如下,很简单: Java代码 隐藏行号 复制代码 ? Source import java.io.File;

finch的学习笔记 1015

SWT 各种小示例集中

SWT 各种小示例集中,确对最全,涵盖了SWT中各基础控件和jface的控件使用

VMware ESXi +DELL虚拟化存储磁盘容量处于紧急状态问题的处理

1、环境介绍 exsi server两台(DELL R730 ): 192.168.3.206 VMware EXSi6.5 192.168.3.207 VMware EXSi6.5 磁盘存储柜一台(DELL SC2000): 192.168.3.208 2、故障处理 由于前期规划的卷空间过大,虚拟机文件逐年增大以后,造成卷的磁盘占用过与整个磁盘空间的容量,虚拟化平台可用容量爆掉,DELL SC2000自动切换到紧急状态,禁止所有磁盘I/O,exsi主机上的虚拟机无法开机 首先,安装

wolf1105的博客 3533

开发技巧--自定义功能按钮开发

【返回Z平台-帮助文档-首页】 需求说明 开发过程 第一、登录Z平台,打开【系统管理 / 开发 / 表单管理】功能。并找到 【客户管理】表单 第二、选择该记录后,点击修改,进入编辑页面,然后,选择表管理中的【客户信息】表。进行修改。 第三、在明细表记录中切换到按钮管理TAB页,点击 新增 按钮 第四、添写自定义按钮相关信息并保存。 第五、保存完成后,执行【创建后台方法JAVA代码】...

★ 赵戬 ★ 一名JAVA程序员的博客 2931

webapi .net core8.0配置使用Token权限认证

本人在网上找了很多版本,不是太复杂就是不行。

m0_74824592的博客 1760

swt自定义控件

  Creating Your Own Widgets using SWT   http://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm   开发Eclipse自定义控件   http://www.ibm.com/develo...

NickACM的专栏 312

先进半导体材料与器件Chapter3

Chapter3 异质结双极晶体管(HBT) 作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 知乎:https:/...

一个会写代码的烤鸭 5803

【CVPR 2025】低光增强HVI论文精读与源码复现---part1 论文网络精读

【CVPR 2025】本文参考论文HVI: A New Color Space for Low-light Image Enhancement part1 在文章中对论文核心网络与原理展开详细解释 part2 对论文公开代码的arch网络与其他核心部分展开详细解释

BOB_BOB_BOB_的博客 3267

swt学习相关文章

一、定制 SWT/RCP 界面     http://www.ibm.com/developerworks/cn/opensource/os-cn-eclswtguic/ 2.开发Eclipse自定义控件      http://www.ibm.com/developerworks/cn/opensource/os-eclipcntl/ 3.SWT 绘图技术

liang0000zai的专栏 982

Linux系统安全学习手册

Linux反弹shell Linux系统应急响应 Linux服务器安全加固 Linux下的用户、组和权限 Linux中的gcc Linux中su和sudo的用法和区别 Linux系统python2与python3共存 Linux中grep工具的使用 Linux中环境变量的设置 Linux中常见的150个命令(干货) Linux中编写Shell脚本 LNMP环境搭建Wordpress博客 LAMP环境搭建一个Discuz论坛 Linux运维比较常用的一些脚本 Linux系统中安装软

谢公子的博客 7532

eclipse RCP开发 table相关的操作

插件开发时,表是用的比较多的控件之一,但SWT提供的表只能提供最简单的表。 本文通过具体的例子,对于表的每一列加自定义控件以及对于表的一些删除,增加行操作进行说明。 表的单元格里加自定义控件在http://blog.youkuaiyun.com/jdzms23/article/details/7248444里有说明, 但用cellEditor实现时,有一点不爽的地方就是必须单击此单元格后,控件才会显示出

jdzms23的专栏 5353

RH850从0搭建Autosar开发环境【17】- Davinci Configurator之DCM模块配置详解(下)

RH850从0搭建Autosar开发环境【17】- Davinci Configurator之DCM模块配置详解(下)

weixin_42412049的博客 2379

微博scheme

微博scheme

qq_42278595的博客 320

SWT_JFace_RCP学习相关网页

1、SWT中为Compsite显示滚动条效果 http://blog.youkuaiyun.com/heruiup/article/details/5474732 2、JFace 的 ApplicationWindow 类应用实例 http://blog.youkuaiyun.com/javafreely/article/details/8316287 3、14.5 表格的排序(ViewerSorter类)http:

bei_fang_du_lang的专栏 498

【Unity 反向运动学插件】Final IK 一套完整的IK解决方案

Final IK是Unity中一套完整的反向运动学解决方案,提供多种IK算法(CCD、FABRIK等)和功能模块,包括全身IK、VR驱动、武器瞄准、视线跟随等。其核心是通过数学方法计算关节旋转,使末端骨骼精确到达目标位置。系统支持多约束求解、旋转限制、动画烘焙及交互系统,采用模块化设计,兼顾性能与扩展性,适用于动作游戏、VR等需要高质量角色控制的场景,是Unity生态中最成熟的IK工具链之一。

2403_88403568的博客 1007

厌倦了SWT TABLE,何不试试KTABLE?

厌倦了SWT TABLE,何不试试KTABLE?java,rcp,eclipse,swt,table,rich client很多项目都对表格控件有较高要求,用过eclipse3.0 中的SWT TABLE的人也许对对它很失望,结构怪异,而且要实现一些特殊需求很费劲,尽管是到了eclipse3.2,TABLE改进很大,但依然不尽如人意,最近尝试了KTABLE,发现真是个好东东,想想实现下面的

mudboy的专栏 3214

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

定制 SWT/RCP 界面:如何编写一个漂亮的 SWT/RCP 界面

引言   Java 自从 1995 年发布以来,其图形界面一直为世人所诟病。无论是早期的 AWT,还是后来的 Swing 应用程序不能像本地应用程序一样执行,外观也不一样,响应的速度也不快。SWT 吸收了 AWT 和 Swing 实现的最好的部分 : 当可以得到本地组件时调用本地实现,当不能得到本地组件时使用 Java 实现。这就同时保证了与本地窗口部件相当的外观,又提高了响应速度。

136

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[转载]开发Eclipse自定义控件

开发Eclipse自定义控件现在基于Eclipse的应用越来越多,很多桌面应用都是用Eclipse开发的。Eclipse提供了一套SWT/JFACE 的控件库,使得人们开发界面应用极大的方便。但是,SWT/JFACE的控件库毕...

congji3817的博客 232

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设置TableViewer 中的高度和宽度

//此处的Table就是读者所使用的table //此处本人所使用的table  是通过 tableViewer.getTable();来的 读者可自行做转换 Table.addListener(SWT.MeasureItem, new Listener() { @Override public void handleEvent(Event event) { // TODO 自动生成

Mrzhang0419的专栏 2573

Eclipse SWT相关API介绍

继承Layout,实现computeSize和layout方法,computeSize容器用来计算自己的偏好尺寸。layout方法是调用shell.layout时,容器类调用的方法,这个方法真正负责排布控件的任务。

分享技术干货和灵感、推荐新书和好玩的项目、分享Java面试题 945

【eclipse插件开发实战】Eclipse插件开发2——SWT

Eclipse插件开发2——SWT cdsv

DianaCody's Blog 3875

开发Eclipse自定义控件

转自http://www.ibm.com/developerworks/cn/opensource/os-eclipcntl/开发Eclipse自定义控件级别: 初级梁骞 , IBM 中国软件开发中心, IBM2005 年 9 月 现在基于Eclipse的应用越来越多,很多桌面应用都是用Eclipse开发的。Eclipse提供了一套SWT/JFACE的控件库,使得人们开发界面应

笨笨熊的专栏 876

SWT界面开发Eclipse插件WindowBuilder

过去用于开发SWT界面开发的Eclipse插件名为SWT Designer,这个项目10年前已经停止维护,其界面设计能力也非常初级。此后Google公司以该插件作为基础,延续了一个新的项目名为WindowBuilder。作为SWT Designer的升级产品,WindowBuilder能够更好的支持Swing、SWT和JFace的界面设计,完全可见既可得,非常适用于初学者和小型的桌面软件开发。

时哲技术博客 5251
上一篇: ThreadLocal的设计与使用
下一篇: 正则的java中的三种应用
danning
博客等级 码龄22年 5粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值