开发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的控件使用

B站李沐讲论文笔记AlexNet

B站李沐讲论文笔记AlexNet

夏知识不进脑子薇的博客 790

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

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

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

纽马克-贝塔法(Newmark-Beta Method)在结构动力学中的应用与实现

本文深入解析了纽马克-贝塔法(Newmark-Beta Method)在结构动力学数值计算中的核心原理与应用。作为经典的时间积分算法,它通过调节γ和β参数,在计算精度、稳定性与效率间取得平衡,尤其适用于地震响应、风振分析等工程场景。文章详细阐述了其数学内核、在有限元分析中的实现步骤,并对比了隐式与显式方案的适用场景,为工程师提供了关键的方法选择与参数调优指导。

weixin_29232121的博客 148

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

映泰TB250-BTC主板魔改BIOS支持8/9代CPU实战与开机故障排查

BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,负责初始化硬件和提供运行时服务。其工作原理是通过存储在主板芯片中的固件程序,在上电自检(POST)阶段完成对CPU、内存等关键组件的检测与配置。魔改BIOS的技术价值在于突破硬件限制,通过修改微码和电源管理模块,让旧平台支持新处理器,从而以极低成本实现性能跃升,在预算有限或追求极致性价比的DIY、办公和软路由等应用场景中极具吸引力。本文以映泰TB250-BTC矿板为例,详细解析了通过软刷方式刷入魔改BIOS,并重点解决了刷写后常见的“开机风扇转一

weixin_29164185的博客 407

CV领域交叉注意力机制:QKV在图像特征增强中的核心作用解析

本文深入解析了CV领域中交叉注意力机制的核心组件QKV在图像特征增强中的关键作用。通过通俗类比和实战案例,阐述了Q(查询)、K(键)、V(值)如何协同实现动态权重分配,从而在目标检测、图像分割与生成等任务中显著提升模型性能与语义对齐能力。

weixin_29194817的博客 442

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

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读

场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。

2301_81299416的博客 2542

eclipse RCP开发 table相关的操作

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

jdzms23的专栏 5353

LabVIEW进行MQTT通信及数据解析

该文章介绍了LabVIEW的MQTT通信的开源VI控制,以及如果进行数据的解析,特别是一些需要注意的点

heda3的博客 4106

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

专注于编程、AI、人工智能等多个领域内容研究和分析 725

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

生物量预测:基于Swin-Unet模型的生物量模型预测

本文提出了一种基于Swin-Unet架构的多源遥感地上生物量(AGB)预测方法。该方法整合了光学影像、SAR雷达影像、气候环境参数以及地形数据(坡度和坡向)等多源信息,通过24个输入通道(13+2+7+1+1)构建预测模型。研究采用Min-Max归一化预处理数据,并使用80%训练集、16%验证集和20%测试集的划分策略。模型基于Swin-Unet 2D架构,设置64个初始滤波器、4层深度、4×4堆叠数和2×2补丁大小。该方法通过整合多源遥感数据和先进深度学习架构,为AGB反演提供了新的解决方案。

此星光明博客 63

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

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

mudboy的专栏 3214

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

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

136

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

congji3817的博客 232

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

设置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、付费专栏及课程。

余额充值