ui
10km
这个作者很懒,什么都没留下…
展开
-
java SWT: 重写dispose()和DisposeListener的区别
当需要在Widget被销毁(dispose)的时候执行一些比如释放资源的动作时,有两个途径来执行这些动作: 1. 重写dispose()方法,在dispose中释放资源的动作。 2. 添加DisposeListener,监听SWT.Dispose事件,在Listener中执行释放资源的动作。 应该用哪种方式呢? 答案是方法2,因为虽然都能执行dispose动作,但SWT隐式销毁对象的时候并不原创 2016-12-10 14:07:55 · 3092 阅读 · 0 评论 -
jface databinding:更简单的ISideEffect实现多目标单边数据绑定塈其原理分析
Eclipse 4.6 提供了名为 ISideEffect的数据绑定工具. ISideEffect可以实现当一个或多个观察对象(IObservable)改变时执行特定代码。 ISideEffect很像一个侦听器,但它却不需要开发者像侦听器那样作任何依附对象的动作(addChangeListener/removeChangeListener)。当被监控的观察对象改变时它会自动反应执行指定的代码。原创 2016-12-25 17:49:15 · 1029 阅读 · 1 评论 -
jface databinding:构建一个改进版的通用型数值验证器StringToNumberValidator
jface已经提供了基于AbstractStringToNumberValidator的基本类型数值验证器IValidator 但是在项目实际使用中发现这些验证器有缺点:空字符串被视为合法,可以通过验证,而且一般情况下,我们会视空字符串为无效输入数值解析错误时返回的信息为英文而且太详细,用户体验不好。其实如果用户输入了非数字导致解析错误时只要提示输入无效就可以了,没必要太详细,更不能是英文原创 2016-12-25 11:13:28 · 687 阅读 · 0 评论 -
jface databinding:UpdateValueStrategy(数值更新策略)类详解
在jface databinding(数据绑定框架)中,org.eclipse.core.databinding.UpdateValueStrategy 更新策略类是个比较重要的类,通过了解它可以更容易理解数据绑定的整个框架,起到提纲挈领的作用。 这个类的作用是定义被绑定的源/目标两个可观察值(observable value)之间数据更新、验证、转换的方式。数据更新步骤数据更新步骤分为:原创 2016-12-24 17:52:34 · 1082 阅读 · 0 评论 -
jface databinding:部分实现POJO对象的监测
在前一篇博文《jface databinding/PojoBindable实现对POJO对象的支持 》中,已经知道直接对POJO对象进行修改,是不能被绑定的UI组件知道的,在上一篇文章中虽然说到PojoBindable这个项目可以解决这个问题,但这个项目并不成熟,所以我没有采用这个方案,而且如果要改造所有的POJO类支持PropertyChangeSupport又实在太麻烦了。 仔细想想我的需求原创 2016-12-23 14:46:53 · 1315 阅读 · 1 评论 -
jface databinding/PojoBindable实现对POJO对象的支持
POJO对象无法被监控在jface databinding中,将普通的java bean(有get/set方法但没有通过PropertyChangeSupport实现属性监控)定义为POJO对象。 我们可以对POJO对象通过PojoProperties.value(String propertyName)方法提供IObservableValue实例,但返回的PojoValueProperty实例并原创 2016-12-22 12:04:55 · 878 阅读 · 1 评论 -
jface databinding(数据挷定)中的数据转换(IConverter)和数据验证(IValidator )
前几天在做对话框界面过程中,对行文本框中的输入数值需要进行验证,于是对Text组件做了扩展,做了一个可以验证输入的字符串是否为数值的NumText组件,参见 《java SWT:限制数值输入的Text文本框通用组件》,但是在使用过程中发现,这种方式有缺陷,就是如果用户输入非法的字符,结果就是输不进去,界面上不会有报错也不会有任何提示,用户体验不好。 之前对databinding有过简单的了解,知道原创 2016-12-22 00:15:19 · 1459 阅读 · 0 评论 -
jface databinding:延迟计算--ComputedValue和WritableList使用的例子
org.eclipse.core.databinding.observable.value.ComputedValue类实现IObservableValue接口,提供对象T的延迟计算特性,它提供了一个抽象方法calculate,实现这个方法就可以实现根据多个可监控对象(IObservableValue)计算更新当前对象的需求。 尼玛,好抽象,我自己都不知道在说什么,还是举个例子吧。 比如我们有一原创 2016-12-21 15:06:23 · 1126 阅读 · 0 评论 -
jface databinding:输入无效数值时强制恢复初始值-updateModelToTarget
如下代码显示一个简单的对话框,Text文本框中初始是个浮点数0.5,修改文本框中的内容不符合float数值格式时,左上角会提示出错。点击下面的”恢复初始值”按钮,希望能恢复初始值0.5。 package testwb;import org.eclipse.jface.dialogs.Dialog;import org.eclipse.jface.dialogs.IDialogConstants;原创 2016-12-27 15:11:16 · 625 阅读 · 0 评论 -
jface databinding:label provider 实现多列表格(Table)数据绑定的两个途径
显示需求如下图,希望将一组拥有两个字段的表与两列的table绑定在一起,实现自动显示。 在jface viewer中label provider用于提供数据对象到视图对象(viewer)显示内容的数据映射关系。也就是实现将数据模型中的不同字段的内容显示为viewer(如表格Table组件)中的文字或图像。 如下图IBaseLabelProvider是所有label provider的顶层抽象原创 2017-01-06 13:56:02 · 1675 阅读 · 0 评论 -
java SWT:Display.addFilter设置快捷键的例子-切换全屏
以前只知道org.eclipse.swt.widgets.Widget以及子类可以添加Listener。 今天才搞清楚: Display也addListener方法,而且还有优先级更高的addFilter方法: addFilter方法的原文说明: Adds the listener to the collection of listeners who will be notified原创 2016-12-09 11:25:15 · 1987 阅读 · 0 评论 -
jface databinding: Radio Button group及ISideEffect绑定数据对象的例子
下图左侧是三个Radio button,设计的要求是选择不同的radio button,右侧的三个group会分别有不同的可见状态(visible),并且将radio button状态与数据对象绑定 下面是用SelectObservableValue来实现数据绑定,并在ISideEffect的帮助下完成右边三个组件的可见状态控制。 // 创建SelectObservableValue原创 2016-12-25 18:25:06 · 1285 阅读 · 0 评论 -
jface databinding: 创建readonly(只读)可观察对象(observable)
java与C++有一点不同:C++有const关键字,使用const关键字,用于指定一个参数、成员变量或函数是只读不可修改的,通过const参数让对象成为readonly的,可以严格禁止外部调用修改对象的内容。而java没有类似的限制,只有一个final指定变量不可以被赋值,但还是可以通过调用变量的方法任意修改变量指向的对象内部状态。也就是说,java没有像C++那样有绝对readonly的限制。原创 2016-12-27 13:17:54 · 780 阅读 · 0 评论 -
java SWT:TraverseEvent的理解塈添加TraverseListener实现Composite之间TAB键切换焦点
TraverseEvent遍历事件从英文直译的话,org.eclipse.swt.events.TraverseEvent是指widget中组件遍历(切换焦点)动作发生时产生的事件 举例来说,就是当我们使用光标键,TAB/shift-TAB键,PAGE-UP/DOWN等键在按钮(Button)之间切换焦点的时候,就会产生TraverseEvent事件。 关于TraverseEven的原文说明,原创 2016-12-03 17:05:10 · 1699 阅读 · 0 评论 -
java SWT入门:自定义背景透明且可鼠标拖动改变尺寸和位置的Composite
下面的代码实现了一个透明可移动可改变尺寸的Composite窗体,如下图 鼠标点击窗口获取焦点,在获取焦点时会显示9个锚点用于改变窗口的位置和尺寸。ActiveRectangle.javapackage net.gdface.ui;import org.eclipse.swt.SWT;import org.eclipse.swt.widgets.Composite;import org.原创 2016-12-01 20:10:37 · 4095 阅读 · 0 评论 -
java:SWT 缩放图像(Image)
在SWT中下面两个方法都可以实现Image缩放, GC.drawImage(Image image, int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight); ImageData.scaledTo(int width, int height)但是为了原创 2016-11-28 18:22:33 · 4637 阅读 · 0 评论 -
WindowBuilder入门:使用swt的canvas类构造显示URL图像
首先如创建一个基于于Canvas的ImageCanvas类,ImageCanvas.javapackage net.gdface.ui;import java.net.URL;import org.eclipse.swt.events.PaintEvent;import org.eclipse.swt.events.PaintListener;import org.eclipse.swt.gra原创 2016-11-28 15:24:59 · 2392 阅读 · 0 评论 -
java SWT:最有效的layout方法Control.requestLayout()
Eclipse SWT最新的版本中org.eclipse.swt.widgets.Control增加了一个新方法requestLayout()用于更高效的处理layout请求 该方法其实只有一行代码:public void requestLayout () { getShell ().layout (new Control[] {this}, SWT.DEFER);}这是SWT当前最高效原创 2016-12-03 17:20:51 · 1283 阅读 · 0 评论 -
java SWT:用SWTKeySupport方便进行组合键判断(如Ctrl+F11)
SWT下如果判断包含shfit,ctrl,alt的组合键,就要用到KeyEvent的stateMask字段。 关于stateMask的用法,参见我的上一篇博客《java SWT:MouseEvent,KeyEvent中stateMask字段的用法》比如我们要用Ctrl-F11来实现全屏和正常屏幕显示的切换,直接使用stateMask字段判断的代码可以写成这样: /** * 屏幕原创 2016-12-05 18:44:57 · 1532 阅读 · 0 评论 -
java SWT:基于Composite定制背景透明的浮动图像按钮(image button)
SWT对于图形按钮没有很好的支持,反正我折腾了半天,发现用org.eclipse.swt.widgets.Button是没办法做出好看的图形按按钮的. 于是就参考org.eclipse.ui.forms.widgets.ImageHyperlink自己撸了一个: 效果嘛,参见下图, 请忽略左边的美女: 鼠标不在按钮区域时的未激活状态 鼠标进入按钮区域时的激活状态 下面是完整代码,很原创 2016-12-06 16:44:28 · 6049 阅读 · 2 评论 -
java SWT: addFilter热键监听Ctrl-C不正常的问题
SWT跟有道词典有什么关系?这两个东西有什么关联么? 如果你已经知道它们的关联就不需要看本文了。 下面是用windowbuilder生成的一个简单的java代码,我在代码中用addFilter增加了对Ctrl-C热键的侦听。如果检测到Ctrl-C按下,就输出消息。 实现的情况是: Ctrl-C键的确可以被检测到 但是在程序的界面中按下鼠标左键拖动一段距离再松开,也能检测出Ctrl-C。原创 2016-12-17 13:05:39 · 1298 阅读 · 1 评论 -
java:Observable/Observer模式在SWT环境下UI线程/非UI线程的透明化调用
观察者模式(Observable/Observer)在UI设计方面非常有用,可以通过Observer来实现UI界面的更新,因而可以实现UI层与业务层的分离。 但是我们知道大部分UI框架(比如SWT)都要区分UI线程和非UI线程,如果Observable对象在非UI线程执行notifyObservers操作,而Observer的update方法又涉及UI对象的操作时就会抛出异常。(参见 《SWT的U原创 2016-12-15 14:44:04 · 933 阅读 · 1 评论 -
java SWT:限制数值输入的Text文本框通用组件
控制Text只能输入数值只能输入数值的原理很简单,就是利用VerifyListener侦听器,响应VerifyEvent 事件,对输入内容进行检查。 具体如何难输入的内容是有效数字,网上有很多文章介绍如何实现,有是检查输入字符是不是0-9,这种方式有局限性,有的是利用正则表达式来判断,写得好复杂。 其实利用Float,Integer,Double这些类的静态方法valeOf(String)就能准原创 2016-12-18 18:46:26 · 5057 阅读 · 1 评论 -
WindowBuilder:Anonymous class creation can not be evaluated.
WindowBuilder的对包含匿名类的java代码支持不太好, protected void createContents() { shell = new Shell(SWT.NO_TRIM | SWT.ON_TOP); shell.setSize(648, 480); shell.setText("标签编译器");原创 2016-12-05 18:58:51 · 851 阅读 · 0 评论