??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品亚洲专区无码WEB,亚洲国产成人久久99精品,亚洲一区二区三区偷拍女厕 http://www.tkk7.com/wqnashqu/category/24622.html工作日志…?
<table border="0" background ="http://www.tkk7.com/images/blogjava_net/wqnashqu/yan.gif">
<tr><td nowrap="nowrap" valign="top" align="left" height="32">
</td>
<td nowrap="nowrap">
<input type="hidden" name="domains" value="codesearch.google.com;www.tkk7.com;www.ibm.com"></input>
<label for="sbi" style="display: none">输入您的搜烦字词</label>
<input type="text" name="q" size="26" maxlength="255" value="" id="sbi"></input>
<label for="sbb" style="display: none">提交搜烦表单</label>
<input type="submit" name="sa" value="Google 搜烦" id="sbb"></input>
</td></tr>
<tr>
<td> </td>
<td nowrap="nowrap">
<table>
<tr>
<td>
<input type="radio" name="sitesearch" value="" checked id="ss0"></input>
<label for="ss0" title="搜烦 www.google.com"><font size="-1" ">www.google.com</font></label></td>
<td>
<input type="radio" name="sitesearch" value="codesearch.google.com" id="ss1"></input>
<label for="ss1" title="搜烦 codesearch.google.com"><font size="-1" >codesearch.google.com</font></label></td>
</tr>
<tr>
<td>
<input type="radio" name="sitesearch" value="www.tkk7.com" id="ss2"></input>
<label for="ss2" title="搜烦 www.tkk7.com"><font size="-1" >www.tkk7.com</font></label></td>
<td>
<input type="radio" name="sitesearch" value="www.ibm.com" id="ss3"></input>
<label for="ss3" title="搜烦 www.ibm.com"><font size="-1" >www.ibm.com</font></label></td>
</tr>
</table>
<input type="hidden" name="client" value="pub-5842524610105352"></input>
<input type="hidden" name="forid" value="1"></input>
<input type="hidden" name="ie" value="GB2312"></input>
<input type="hidden" name="oe" value="GB2312"></input>
<input type="hidden" name="cof" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;LH:45;LW:166;L:http://www.tkk7.com/images/logo.gif;S:http://www.tkk7.com/wqnashqu;FORID:1"></input>
<input type="hidden" name="hl" value="zh_CN"></input>
</td></tr></table> zh-cn Wed, 23 Apr 2008 19:53:48 GMT Wed, 23 Apr 2008 19:53:48 GMT 60 SWT JFACE .TreeViewer Expand事g及其节点处理Ҏ http://www.tkk7.com/wqnashqu/archive/2008/04/23/194911.html曲强 Nicky 曲强 Nicky Tue, 22 Apr 2008 16:10:00 GMT http://www.tkk7.com/wqnashqu/archive/2008/04/23/194911.html http://www.tkk7.com/wqnashqu/comments/194911.html http://www.tkk7.com/wqnashqu/archive/2008/04/23/194911.html#Feedback 0 http://www.tkk7.com/wqnashqu/comments/commentRss/194911.html http://www.tkk7.com/wqnashqu/services/trackbacks/194911.html
的承关pL 阅读全文 ]]> IBM ?Java 诊断 http://www.tkk7.com/wqnashqu/archive/2007/11/16/161030.html曲强 Nicky 曲强 Nicky Fri, 16 Nov 2007 07:36:00 GMT http://www.tkk7.com/wqnashqu/archive/2007/11/16/161030.html http://www.tkk7.com/wqnashqu/comments/161030.html http://www.tkk7.com/wqnashqu/archive/2007/11/16/161030.html#Feedback 1 http://www.tkk7.com/wqnashqu/comments/commentRss/161030.html http://www.tkk7.com/wqnashqu/services/trackbacks/161030.html 阅读全文 ]]> @hotjava Smallworld&&PMI http://www.tkk7.com/wqnashqu/archive/2007/07/21/131679.html曲强 Nicky 曲强 Nicky Sat, 21 Jul 2007 15:34:00 GMT http://www.tkk7.com/wqnashqu/archive/2007/07/21/131679.html http://www.tkk7.com/wqnashqu/comments/131679.html http://www.tkk7.com/wqnashqu/archive/2007/07/21/131679.html#Feedback 0 http://www.tkk7.com/wqnashqu/comments/commentRss/131679.html http://www.tkk7.com/wqnashqu/services/trackbacks/131679.html 阅读全文 ]]> PMI http://www.tkk7.com/wqnashqu/archive/2007/07/13/130020.html曲强 Nicky 曲强 Nicky Fri, 13 Jul 2007 09:32:00 GMT http://www.tkk7.com/wqnashqu/archive/2007/07/13/130020.html http://www.tkk7.com/wqnashqu/comments/130020.html http://www.tkk7.com/wqnashqu/archive/2007/07/13/130020.html#Feedback 2 http://www.tkk7.com/wqnashqu/comments/commentRss/130020.html http://www.tkk7.com/wqnashqu/services/trackbacks/130020.html 阅读全文 ]]> ITM http://www.tkk7.com/wqnashqu/archive/2007/05/11/116899.html曲强 Nicky 曲强 Nicky Fri, 11 May 2007 15:00:00 GMT http://www.tkk7.com/wqnashqu/archive/2007/05/11/116899.html http://www.tkk7.com/wqnashqu/comments/116899.html http://www.tkk7.com/wqnashqu/archive/2007/05/11/116899.html#Feedback 0 http://www.tkk7.com/wqnashqu/comments/commentRss/116899.html http://www.tkk7.com/wqnashqu/services/trackbacks/116899.html ITM provides out of box uses to quickly deploy and active the app with the best ibm practice.admins can define the user's views,threshold and so on.Tivoli Enterprise Monitoring Agents are available for monitoring different types of platforms and applications, including mainframes,middleware,distributed,and database... 阅读全文 ]]> Little for ITM && CLI http://www.tkk7.com/wqnashqu/archive/2007/05/10/116615.html曲强 Nicky 曲强 Nicky Thu, 10 May 2007 15:23:00 GMT http://www.tkk7.com/wqnashqu/archive/2007/05/10/116615.html http://www.tkk7.com/wqnashqu/comments/116615.html http://www.tkk7.com/wqnashqu/archive/2007/05/10/116615.html#Feedback 0 http://www.tkk7.com/wqnashqu/comments/commentRss/116615.html http://www.tkk7.com/wqnashqu/services/trackbacks/116615.html 阅读全文 ]]> 利用 Ant ?JUnit q行增量开?转蝲fromIBM) http://www.tkk7.com/wqnashqu/archive/2007/04/19/111945.html曲强 Nicky 曲强 Nicky Thu, 19 Apr 2007 06:52:00 GMT http://www.tkk7.com/wqnashqu/archive/2007/04/19/111945.html http://www.tkk7.com/wqnashqu/comments/111945.html http://www.tkk7.com/wqnashqu/archive/2007/04/19/111945.html#Feedback 0 http://www.tkk7.com/wqnashqu/comments/commentRss/111945.html http://www.tkk7.com/wqnashqu/services/trackbacks/111945.html 阅读全文 ]]> SWT http://www.tkk7.com/wqnashqu/archive/2006/05/20/47198.html曲强 Nicky 曲强 Nicky Sat, 20 May 2006 10:36:00 GMT http://www.tkk7.com/wqnashqu/archive/2006/05/20/47198.html http://www.tkk7.com/wqnashqu/comments/47198.html http://www.tkk7.com/wqnashqu/archive/2006/05/20/47198.html#Feedback 0 http://www.tkk7.com/wqnashqu/comments/commentRss/47198.html http://www.tkk7.com/wqnashqu/services/trackbacks/47198.html
SWT本n仅仅是Eclipsel织Z开发Eclipse IDE环境所~写的一l底层图形界?
API。或许是无心插柳Q或是有意ؓ之,至今为止QSWT无论是在性能和外观上Q都越了SUN公司提供的AWT和SWING。目前Eclipse
IDE已经开发到?.1版本QSWT已经十分E_。这里指的稳定应该包含两层意思:
一是指性能上的E_Q其中的关键是源于SWT的设计理cSWT最大化了操作系l的囑Ş构gAPIQ就是说只要操作pȝ提供了相应图形的构gQ那?
SWT只是单应用JNI技术调用它们,只有那些操作pȝ中不提供的构ӞSWT才自己去做一个模拟的实现。可以看出SWT的性能上的E_大多时候取决于
相应操作pȝ囑Ş构g的稳定性?br>
另一个稳定是指SWT API包中的类、方法的名称和结构已l少有改变,E序员不用担心由于Eclipsel织开发进度很快(Eclipse
IDE每天都会有一个Nightly版本的发布)Q而导致自qE序代码变化q大。从一个版本的SWT更新臛_一版本Q通常只需要简单将SWT包换掉就?
以了?br>
W一个SWTE序
下面让我们开始一个SWTE序。(注意Q以下的例子和说明主要针对Windowsq_Q其它的操作pȝ应该大同异Q。首先要在Eclipse安装?
件中扑ֈSWT包,Eclipsel织q不提供单独的SWT包下载,必须下蝲完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse
开发环境的一个插件Ş式存在,可以?{你的eclipse安装路径}\plugins路径下的众多子目录下L索SWT.JAR文gQ在扑ֈ的JAR?
件中包含了SWT全部的JavacL件。因为SWT应用了JNI技术,因此同时也要扑ֈ相对应的JNI本地化库文gQ由于版本和操作q_的不同,本地化库
文g的名UC有些差别Q比如SWT-WIN32-2116.DLL是Windowq_下Eclipse Build
2116的动态库Q而在Unixq_相应版本的库文g的扩展名应该?soQ等{。注意的是,Eclipse是一个开放源代码的项目,因此你也可以在这?
目录中找到SWT的源代码Q相信这会对开发很有帮助。下面是一D|开I窗口的代码(只有mainҎ)?
import com.e2one.example;
public class OpenShell{
public static void main(String [] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.open();
// 开始事件处理@环,直到用户关闭H口
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
信在CLASSPATH中包括了SWT.JAR文gQ先用Javac~译例子E序。编译无错后可运行java
-Djava.library.path=${你的SWT本地库文件所在\径}
com.e2one.example.OpenShellQ比如SWT-WIN32-2116.DLL件所在的路径是C:\swtlibQ运行的命o应该
是java -Djava.library.path=c:\swtlib
com.e2one.example.OpenShell。成功运行后Q系l会打开了一个空的窗口?
剖析SWT API
下面再让我们q一步分析SWT
API的组成。所有的SWTc都用org.eclipse.swt做ؓ包的前缀Q下面ؓ了简化说明,我们?号代表前~org.eclipse.swtQ?
比如*.widgets包,代表的是org.eclipse.swt.widgets包?
我们最常用的图形构件基本都被包括在*.widgets包中Q比如ButtonQComboQTextQLabelQSashQTable{等。其?
两个最重要的构件当数Shell和Composite。Shell相当于应用程序的ȝ口框Ӟ上面的例子代码中是应用Shell构g打开一个空H口?
Composite相当于SWING中的Panel对象Q充当着构g容器的角Ԍ当我们想在一个窗口中加入一些构件时Q最好到使用Composite作ؓ
其它构g的容器,然后再去*.layout包找ZU合适的布局方式。SWTҎ件的布局也采用了SWING或AWT中Layout和Layout
Datal合的方式,?.layout包中可以扑ֈ四种Layout和与它们相对应的布局l构对象QLayout
DataQ。在*.custom包中Q包含了对一些基本图形构件的扩展Q比如其中的CLabelQ就是对标准Label构g的扩展,上面可以同时加入文字
和图片,也可以加Ҏ。StyledText是Text构g的扩展,它提供了丰富的文本功能,比如ҎD|字的背景艌Ӏ前景色或字体的讄。在
*.custom包中也可扑ֈ一个新的StackLayout布局方式?
SWT对用h作的响应Q比如鼠标或键盘事gQ也是采用了AWT和SWING中的Observer模式Q在*.event包中可以扑ֈ事g监听?
Listener接口和相应的事g对象Q例如常用的鼠标事g监听接口MouseListenerQMouseMoveListener?
MouseTrackListenerQ及对应的事件对象MouseEvent?
*.graphics包中可以扑ֈ针对囄、光标、字体或l图的API。比如可通过Imagec调用系l中不同cd的图片文件。通过GCcd现对囄、构件或昄器的l图功能?
对不同^収ͼEclipseq开发了一些富有针Ҏ的API。例如,在Windowsq_Q可以通过*.ole.win32包很Ҏ的调用ole控gQ这使JavaE序内嵌IE览器或Word、Excel{程序成为可能!
更复杂的E序
下面让我们展CZ个比上面例子更加复杂一些的E序。这个程序拥有一个文本框和一个按键,当用LL键的时候,文本框显CZ句欢q信息?
Z文本框和按键有比较合理的大小和布局Q这里采用了GradLayout布局方式。这U布局是SWT中最常用也是最强大的布局方式Q几乎所有的格式
都可能通过GradLayout去达到。下面的E序也涉及到了如何应用系l资?Color)Q以及如何释攄l资源?
private void initShell(Shell shell) {
//为Shell讄布局对象
GridLayout gShellLay = new GridLayout();
shell.setLayout(gShellLay);
//构造一个Composite构g作ؓ文本框和按键的容?br>
Composite panel = new Composite(shell,SWT.NONE);
//为Panel指定一个布局l构对象?br>
q里让Panel可能的占满ShellQ?br>
也就是全部应用程序窗口的I间?br>
GridData gPanelData = new GridData(GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
panel.setLayoutData(gPanelData);
//为Panel也设|一个布局对象。文本框和按键将按这个布局对象来显C?br>
GridLayout gPanelLay = new GridLayout();
panel.setLayout(gPanelLay);
//为Panel生成一个背景色
final Color bkColor = new Color(Display.getCurrent(),200,0,200);
panel.setBackground(bkColor);
//生成文本?br>
final Text text = new Text(panel,SWT.MULTI|SWT.WRAP);
//为文本框指定一个布局l构对象Q?br>
q里让文本框可能的占满Panel的空间?br>
GridData gTextData = new GridData (GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
text.setLayoutData(gTextData);
//生成按键
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
//为按键指定鼠标事?br>
butt.addMouseListener(new MouseAdapter(){
public void mouseDown(MouseEvent e){
//当用LL键的时候,昄信息
text.setText("Hello SWT");
}
});
//当主H口关闭Ӟ会触发DisposeListener。这里用来释放Panel的背景色?br>
shell.addDisposeListener(new DisposeListener(){
public void widgetDisposed(DisposeEvent e) {
bkColor.dispose();
}
});
}
把这D代码中的方法initShell()加入到第一个打开I窗口的例子中,得到的是一D能成功q行的完整GUI应用E序。运行方法可参考第一个例子?nbsp;
pȝ资源的管?
在一个图形化的操作系l中开发程序,都要调用pȝ中的资源Q如囄、字体、颜色等。通常q些资源都是有限的,E序员务必非常小心的使用q些资源Q当不再使用它们Ӟp快释放Q不然操作系l迟早会油尽灯枯Q不得不重新启动Q更严重的会Dpȝ崩溃?
SWT是用Java开发的QJava语言本n的一大优势就是JVM?垃圾回收机制"Q程序员通常不用理会变量的释放,内存的回收等问题。那么对SWT而言Q系l资源的操作是不是也是如此?{案是一个坏消息Q一个好消息?
坏消息是SWTq没采用JVM的垃圑֛收机制去处理操作pȝ的资源回攉题,一个关键的因素是因为JVM的垃圑֛收机制是不可控的Q也是说程序员?
能知道,也不可能做到在某一时刻让JVM回收资源Q这对系l资源的处理是致命的Q试想你的程序希望在一个@环语句中L看数万张囄Q常规的处理方式是每
ơ调入一张,查看Q然后就立即释放该图片资源,而后在@环调入下一张图片,q对操作pȝ而言QQ何时ȝ序占用的仅仅是一张图片的资源。但如果q个q程?
全交lJVMd理,也许会是在@环语句结束后QJVM才会去释攑֛片资源,其结果可能是你的E序q没有运行结束,操作pȝ已经宕掉?br>
但下面的好消息也怼让这个坏消息变得无关紧要。对于SWTQ只需了解两条单的"黄金"法则可以放心的使用pȝ资源Q之所以称为黄金法则,一是因
为少Q只有两条,二是因ؓ它们出奇的简单。第一条是"谁占用,谁释?Q第二条?父构件被销毁,子构件也同时被销?。第一条原则是一个无M例外的原
则,只要E序调用了系l资源类的构造函敎ͼE序应该关心在某一时刻要释放这个系l资源。比如调用了
Font font = new Font (display, "Courier", 10, SWT.NORMAL);
那么应该在不在需要这个Font的时候调?
font.dispose();
对于W二个原则,是指如果E序调用某一构g的dispose()ҎQ那么所有这个构件的子构件也会被自动调用dispose()Ҏ而销毁。通常q里指的子构件与父构件的关系是在调用构g的构造函数时形成的。比如,
Shell shell = new Shell();
Composite parent = new Composite(shell,SWT.NULL);
Composite child = new Composite(parent,SWT.NULL);
其中parent的父构g是shellQ而shell则是E序的主H口Q所以没有相应的父构Ӟ同时parent又包括了child子构件。如果调?
shell.dispose()ҎQ应用第二条法则Q那么parent和child构g的dispose()Ҏ也会被SWT
API自动调用Q它们也随之销毁?
U程问题
在Q何操作^台的GUIpȝ中,Ҏ件或一些图形API的访问操作都要被严格同步q串行化。例如,在一个图形界面中的按键构件可被设成可用状?
(enable)或禁用状?disable)Q正常的处理方式是,用户Ҏ键状态设|操作都要被攑օ到GUIpȝ的事件处理队列中Q这意味着讉K操作?
串行化)Q然后依ơ处理(q意味着讉K操作被同步)。想象当按键可用状态的讄函数q没有执行结束的时候,E序希望再讄该按键ؓ用状态,势必会引?
冲突。实际上Q这U操作在MGUIpȝ都会触发异常?
Java语言本n提供了多线E机Ӟq种机制对GUI~程来说是不利的Q它不能保证囑Ş构g操作的同步与串行化。SWT采用了一U简单而直接的方式
去适应本地GUIpȝ对线E的要求Q在SWT中,通常存在一个被UCؓ"用户U程"的唯一U程Q只有在q个U程中才能调用对构g或某些图形API的访问操
作。如果在非用LE中E序直接调用q些讉K操作Q那么SWTExcepiton异常会被抛出。但是SWT也在*.widget.DisplaycM提供
了两个方法可以间接的在非用户U程的进行图形构件的讉K操作Q这是通过的syncExec(Runnable)和asyncExec(Runnable)
q两个方法去实现的。例如:
//此时E序q行在一个非用户U程中,q且希望在构件panel上加入一个按键?br>
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
}
});
ҎsyncExec()和asyncExec()的区别在于前者要在指定的U程执行l束后才q回Q而后者则无论指定的线E是否执行都会立卌回到当前U程?
SWT的扩展:JFace
JFace与SWT的关pd比Microsoft的MFC与SDK的关p,JFace是基于SWT开发,其API比SWT更加易于使用Q但功能却没SWT来的直接。比如下面的代码应用JFace中的MessageDialog打开一个警告对话框Q?
MessageDialog.openWarning(parent,"Warning","Warning message");
如果只用SWT完成以上功能Q语句不会少?0?
JFace原本是ؓ更加方便的用SWT而编写的一lAPIQ其主要目的是ؓ了开发Eclipse
IDE环境Q而不是ؓ了应用到其它的独立应用程序。因此在Eclipse 2.1版本之前Q很隑ְJFace
API完整的从Eclipse的内核API中剥d来,L要多多少导入一些非JFace以外的Eclipse核心代码cL接口才能得到一个没有Q何编
译错误的JFace开发包。但目前Eclipsel织g已经逐渐意识CJFace在开发独立应用程序v到的重要作用Q在正在开发的2.1版本中,
JFace也开始变成了和SWT一L完整独立的开发包Q只是这个开发包q在变动?W者写本文Ӟ应用的Eclipse2.1M3版本)。JFace开
发包的包前缀是以org.eclipse.jface开头。JAR包和源代码也和SWT一P也在${你的eclipse安装路径}\plugins路径
下去找?
对开发h员来_在开发一个图形构件的时候,比较好的方式是先到JFace包去找一找,看是不是有更z的实现ҎQ如果没有再用SWT包去自己?
现。比如JFace为对话框提供了很好的支持Q除了各U类型的对话?比如上面用的MessageDialogQ或是带有Title栏的对话?Q如要实
C个自定义的对话框也最好从JFace中的Dialogcȝ承,而不是从SWT中的*.widget.Dialogl承?
应用JFace中的Preference包中的类很容易ؓ自己的Y件做Z个很专业的配|对话框。对于Tree、Table{图形构Ӟ它们在显C的
同时也要和数据关联,例如Table中显C的数据Q在JFace中的View包中为此cL件提供了Model-View方式的编E方法,q种Ҏ使显CZ
数据分开Q更加利于开发与l护。JFace中提供最多的功能是Ҏ本内容的处理。可以在org.eclipse.jface.text.*包中扑ֈ数十
个与文本处理相关cR?
与应用程序更q一?
JavaE序通常是以class文g的方式发布的Q运行class需要JRE或JDK的支持。这又是Java
GUIE序的另一个致命的qQ想象对一个面向广大用L应用E序来说Q无Z的程序功能有多简单,或是你的代码十分的精Q你都不得不让用户去下蝲一?
7?M的JREQ那是多么o人沮丧的一件事。而且对程序员来说QClass通常意味着源代码的暴露Q反~译的工兯那些居心叉|的hL得到你的源代
码。虽然有很多对Class的加密方法,但那L以牺牲性能ZL。好在我们还有其它的方式可用Q把Class~译成exe文g!
通过SWT开发包Q简单、跨q_、可靠等q些Java语言本n所h的优Ҏ渐渐融合到图形界面的应用E序开发中厅R因此,我相信Java语言的另一扇成功之门正在逐渐打开。Java语言的声望和它在桌面应用E序QGUIE序Q所取得的成显然极不相W,至今仍然很少能看到非常成功Java桌面E序。虽然有JBuilderQ?
NetbeanQJProbe{大型Y件作Z表,但这仍不能证明Java的GUIE序是成功的Q它们的外观L和同一操作pȝq_下的其它软g昑־格格
不入。对机器配置的需求也g永无止境Q这使得它们只能被一些L拥有当前最高性能PC的程序员们所容忍Q或是那些不在乎金钱和时间的专业用户所接受。对
l大多数计算Z用者来_AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget
ToolkitQSWTQ或许是Javaq一噩梦的终l者,q大JavaE序员终于可以开发出高效率的GUIE序Q它们拥有标准的外观Q几乎没有h能看?
你的E序是用Java写出来的Q更为重要的是,q些E序是跨q_的?
SWT本n仅仅是Eclipsel织Z开发Eclipse IDE环境所~写的一l底层图形界?
API。或许是无心插柳Q或是有意ؓ之,至今为止QSWT无论是在性能和外观上Q都越了SUN公司提供的AWT和SWING。目前Eclipse
IDE已经开发到?.1版本QSWT已经十分E_。这里指的稳定应该包含两层意思:
一是指性能上的E_Q其中的关键是源于SWT的设计理cSWT最大化了操作系l的囑Ş构gAPIQ就是说只要操作pȝ提供了相应图形的构gQ那?
SWT只是单应用JNI技术调用它们,只有那些操作pȝ中不提供的构ӞSWT才自己去做一个模拟的实现。可以看出SWT的性能上的E_大多时候取决于
相应操作pȝ囑Ş构g的稳定性?br>
另一个稳定是指SWT API包中的类、方法的名称和结构已l少有改变,E序员不用担心由于Eclipsel织开发进度很快(Eclipse
IDE每天都会有一个Nightly版本的发布)Q而导致自qE序代码变化q大。从一个版本的SWT更新臛_一版本Q通常只需要简单将SWT包换掉就?
以了?br>
W一个SWTE序
下面让我们开始一个SWTE序。(注意Q以下的例子和说明主要针对Windowsq_Q其它的操作pȝ应该大同异Q。首先要在Eclipse安装?
件中扑ֈSWT包,Eclipsel织q不提供单独的SWT包下载,必须下蝲完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse
开发环境的一个插件Ş式存在,可以?{你的eclipse安装路径}\plugins路径下的众多子目录下L索SWT.JAR文gQ在扑ֈ的JAR?
件中包含了SWT全部的JavacL件。因为SWT应用了JNI技术,因此同时也要扑ֈ相对应的JNI本地化库文gQ由于版本和操作q_的不同,本地化库
文g的名UC有些差别Q比如SWT-WIN32-2116.DLL是Windowq_下Eclipse Build
2116的动态库Q而在Unixq_相应版本的库文g的扩展名应该?soQ等{。注意的是,Eclipse是一个开放源代码的项目,因此你也可以在这?
目录中找到SWT的源代码Q相信这会对开发很有帮助。下面是一D|开I窗口的代码(只有mainҎ)?
import com.e2one.example;
public class OpenShell{
public static void main(String [] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.open();
// 开始事件处理@环,直到用户关闭H口
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
信在CLASSPATH中包括了SWT.JAR文gQ先用Javac~译例子E序。编译无错后可运行java
-Djava.library.path=${你的SWT本地库文件所在\径}
com.e2one.example.OpenShellQ比如SWT-WIN32-2116.DLL件所在的路径是C:\swtlibQ运行的命o应该
是java -Djava.library.path=c:\swtlib
com.e2one.example.OpenShell。成功运行后Q系l会打开了一个空的窗口?
剖析SWT API
下面再让我们q一步分析SWT
API的组成。所有的SWTc都用org.eclipse.swt做ؓ包的前缀Q下面ؓ了简化说明,我们?号代表前~org.eclipse.swtQ?
比如*.widgets包,代表的是org.eclipse.swt.widgets包?
我们最常用的图形构件基本都被包括在*.widgets包中Q比如ButtonQComboQTextQLabelQSashQTable{等。其?
两个最重要的构件当数Shell和Composite。Shell相当于应用程序的ȝ口框Ӟ上面的例子代码中是应用Shell构g打开一个空H口?
Composite相当于SWING中的Panel对象Q充当着构g容器的角Ԍ当我们想在一个窗口中加入一些构件时Q最好到使用Composite作ؓ
其它构g的容器,然后再去*.layout包找ZU合适的布局方式。SWTҎ件的布局也采用了SWING或AWT中Layout和Layout
Datal合的方式,?.layout包中可以扑ֈ四种Layout和与它们相对应的布局l构对象QLayout
DataQ。在*.custom包中Q包含了对一些基本图形构件的扩展Q比如其中的CLabelQ就是对标准Label构g的扩展,上面可以同时加入文字
和图片,也可以加Ҏ。StyledText是Text构g的扩展,它提供了丰富的文本功能,比如ҎD|字的背景艌Ӏ前景色或字体的讄。在
*.custom包中也可扑ֈ一个新的StackLayout布局方式?
SWT对用h作的响应Q比如鼠标或键盘事gQ也是采用了AWT和SWING中的Observer模式Q在*.event包中可以扑ֈ事g监听?
Listener接口和相应的事g对象Q例如常用的鼠标事g监听接口MouseListenerQMouseMoveListener?
MouseTrackListenerQ及对应的事件对象MouseEvent?
*.graphics包中可以扑ֈ针对囄、光标、字体或l图的API。比如可通过Imagec调用系l中不同cd的图片文件。通过GCcd现对囄、构件或昄器的l图功能?
对不同^収ͼEclipseq开发了一些富有针Ҏ的API。例如,在Windowsq_Q可以通过*.ole.win32包很Ҏ的调用ole控gQ这使JavaE序内嵌IE览器或Word、Excel{程序成为可能!
更复杂的E序
下面让我们展CZ个比上面例子更加复杂一些的E序。这个程序拥有一个文本框和一个按键,当用LL键的时候,文本框显CZ句欢q信息?
Z文本框和按键有比较合理的大小和布局Q这里采用了GradLayout布局方式。这U布局是SWT中最常用也是最强大的布局方式Q几乎所有的格式
都可能通过GradLayout去达到。下面的E序也涉及到了如何应用系l资?Color)Q以及如何释攄l资源?
private void initShell(Shell shell) {
//为Shell讄布局对象
GridLayout gShellLay = new GridLayout();
shell.setLayout(gShellLay);
//构造一个Composite构g作ؓ文本框和按键的容?br>
Composite panel = new Composite(shell,SWT.NONE);
//为Panel指定一个布局l构对象?br>
q里让Panel可能的占满ShellQ?br>
也就是全部应用程序窗口的I间?br>
GridData gPanelData = new GridData(GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
panel.setLayoutData(gPanelData);
//为Panel也设|一个布局对象。文本框和按键将按这个布局对象来显C?br>
GridLayout gPanelLay = new GridLayout();
panel.setLayout(gPanelLay);
//为Panel生成一个背景色
final Color bkColor = new Color(Display.getCurrent(),200,0,200);
panel.setBackground(bkColor);
//生成文本?br>
final Text text = new Text(panel,SWT.MULTI|SWT.WRAP);
//为文本框指定一个布局l构对象Q?br>
q里让文本框可能的占满Panel的空间?br>
GridData gTextData = new GridData (GridData.GRAB_HORIZONTAL| GridData.GRAB_VERTICAL|GridData.FILL_BOTH);
text.setLayoutData(gTextData);
//生成按键
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
//为按键指定鼠标事?br>
butt.addMouseListener(new MouseAdapter(){
public void mouseDown(MouseEvent e){
//当用LL键的时候,昄信息
text.setText("Hello SWT");
}
});
//当主H口关闭Ӟ会触发DisposeListener。这里用来释放Panel的背景色?br>
shell.addDisposeListener(new DisposeListener(){
public void widgetDisposed(DisposeEvent e) {
bkColor.dispose();
}
});
}
把这D代码中的方法initShell()加入到第一个打开I窗口的例子中,得到的是一D能成功q行的完整GUI应用E序。运行方法可参考第一个例子?nbsp;
pȝ资源的管?
在一个图形化的操作系l中开发程序,都要调用pȝ中的资源Q如囄、字体、颜色等。通常q些资源都是有限的,E序员务必非常小心的使用q些资源Q当不再使用它们Ӟp快释放Q不然操作系l迟早会油尽灯枯Q不得不重新启动Q更严重的会Dpȝ崩溃?
SWT是用Java开发的QJava语言本n的一大优势就是JVM?垃圾回收机制"Q程序员通常不用理会变量的释放,内存的回收等问题。那么对SWT而言Q系l资源的操作是不是也是如此?{案是一个坏消息Q一个好消息?
坏消息是SWTq没采用JVM的垃圑֛收机制去处理操作pȝ的资源回攉题,一个关键的因素是因为JVM的垃圑֛收机制是不可控的Q也是说程序员?
能知道,也不可能做到在某一时刻让JVM回收资源Q这对系l资源的处理是致命的Q试想你的程序希望在一个@环语句中L看数万张囄Q常规的处理方式是每
ơ调入一张,查看Q然后就立即释放该图片资源,而后在@环调入下一张图片,q对操作pȝ而言QQ何时ȝ序占用的仅仅是一张图片的资源。但如果q个q程?
全交lJVMd理,也许会是在@环语句结束后QJVM才会去释攑֛片资源,其结果可能是你的E序q没有运行结束,操作pȝ已经宕掉?br>
但下面的好消息也怼让这个坏消息变得无关紧要。对于SWTQ只需了解两条单的"黄金"法则可以放心的使用pȝ资源Q之所以称为黄金法则,一是因
为少Q只有两条,二是因ؓ它们出奇的简单。第一条是"谁占用,谁释?Q第二条?父构件被销毁,子构件也同时被销?。第一条原则是一个无M例外的原
则,只要E序调用了系l资源类的构造函敎ͼE序应该关心在某一时刻要释放这个系l资源。比如调用了
Font font = new Font (display, "Courier", 10, SWT.NORMAL);
那么应该在不在需要这个Font的时候调?
font.dispose();
对于W二个原则,是指如果E序调用某一构g的dispose()ҎQ那么所有这个构件的子构件也会被自动调用dispose()Ҏ而销毁。通常q里指的子构件与父构件的关系是在调用构g的构造函数时形成的。比如,
Shell shell = new Shell();
Composite parent = new Composite(shell,SWT.NULL);
Composite child = new Composite(parent,SWT.NULL);
其中parent的父构g是shellQ而shell则是E序的主H口Q所以没有相应的父构Ӟ同时parent又包括了child子构件。如果调?
shell.dispose()ҎQ应用第二条法则Q那么parent和child构g的dispose()Ҏ也会被SWT
API自动调用Q它们也随之销毁?
U程问题
在Q何操作^台的GUIpȝ中,Ҏ件或一些图形API的访问操作都要被严格同步q串行化。例如,在一个图形界面中的按键构件可被设成可用状?
(enable)或禁用状?disable)Q正常的处理方式是,用户Ҏ键状态设|操作都要被攑օ到GUIpȝ的事件处理队列中Q这意味着讉K操作?
串行化)Q然后依ơ处理(q意味着讉K操作被同步)。想象当按键可用状态的讄函数q没有执行结束的时候,E序希望再讄该按键ؓ用状态,势必会引?
冲突。实际上Q这U操作在MGUIpȝ都会触发异常?
Java语言本n提供了多线E机Ӟq种机制对GUI~程来说是不利的Q它不能保证囑Ş构g操作的同步与串行化。SWT采用了一U简单而直接的方式
去适应本地GUIpȝ对线E的要求Q在SWT中,通常存在一个被UCؓ"用户U程"的唯一U程Q只有在q个U程中才能调用对构g或某些图形API的访问操
作。如果在非用LE中E序直接调用q些讉K操作Q那么SWTExcepiton异常会被抛出。但是SWT也在*.widget.DisplaycM提供
了两个方法可以间接的在非用户U程的进行图形构件的讉K操作Q这是通过的syncExec(Runnable)和asyncExec(Runnable)
q两个方法去实现的。例如:
//此时E序q行在一个非用户U程中,q且希望在构件panel上加入一个按键?br>
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
}
});
ҎsyncExec()和asyncExec()的区别在于前者要在指定的U程执行l束后才q回Q而后者则无论指定的线E是否执行都会立卌回到当前U程?
SWT的扩展:JFace
JFace与SWT的关pd比Microsoft的MFC与SDK的关p,JFace是基于SWT开发,其API比SWT更加易于使用Q但功能却没SWT来的直接。比如下面的代码应用JFace中的MessageDialog打开一个警告对话框Q?
MessageDialog.openWarning(parent,"Warning","Warning message");
如果只用SWT完成以上功能Q语句不会少?0?
JFace原本是ؓ更加方便的用SWT而编写的一lAPIQ其主要目的是ؓ了开发Eclipse
IDE环境Q而不是ؓ了应用到其它的独立应用程序。因此在Eclipse 2.1版本之前Q很隑ְJFace
API完整的从Eclipse的内核API中剥d来,L要多多少导入一些非JFace以外的Eclipse核心代码cL接口才能得到一个没有Q何编
译错误的JFace开发包。但目前Eclipsel织g已经逐渐意识CJFace在开发独立应用程序v到的重要作用Q在正在开发的2.1版本中,
JFace也开始变成了和SWT一L完整独立的开发包Q只是这个开发包q在变动?W者写本文Ӟ应用的Eclipse2.1M3版本)。JFace开
发包的包前缀是以org.eclipse.jface开头。JAR包和源代码也和SWT一P也在${你的eclipse安装路径}\plugins路径
下去找?
对开发h员来_在开发一个图形构件的时候,比较好的方式是先到JFace包去找一找,看是不是有更z的实现ҎQ如果没有再用SWT包去自己?
现。比如JFace为对话框提供了很好的支持Q除了各U类型的对话?比如上面用的MessageDialogQ或是带有Title栏的对话?Q如要实
C个自定义的对话框也最好从JFace中的Dialogcȝ承,而不是从SWT中的*.widget.Dialogl承?
应用JFace中的Preference包中的类很容易ؓ自己的Y件做Z个很专业的配|对话框。对于Tree、Table{图形构Ӟ它们在显C的
同时也要和数据关联,例如Table中显C的数据Q在JFace中的View包中为此cL件提供了Model-View方式的编E方法,q种Ҏ使显CZ
数据分开Q更加利于开发与l护。JFace中提供最多的功能是Ҏ本内容的处理。可以在org.eclipse.jface.text.*包中扑ֈ数十
个与文本处理相关cR?
与应用程序更q一?
JavaE序通常是以class文g的方式发布的Q运行class需要JRE或JDK的支持。这又是Java
GUIE序的另一个致命的qQ想象对一个面向广大用L应用E序来说Q无Z的程序功能有多简单,或是你的代码十分的精Q你都不得不让用户去下蝲一?
7?M的JREQ那是多么o人沮丧的一件事。而且对程序员来说QClass通常意味着源代码的暴露Q反~译的工兯那些居心叉|的hL得到你的源代
码。虽然有很多对Class的加密方法,但那L以牺牲性能ZL。好在我们还有其它的方式可用Q把Class~译成exe文g!
通过SWT开发包Q简单、跨q_、可靠等q些Java语言本n所h的优Ҏ渐渐融合到图形界面的应用E序开发中厅R因此,我相信Java语言的另一扇成功之门正在逐渐打开? ]]>
վ֩ģ壺
ɫվ߹ۿ |
aƬƷþþþþþ |
ĻۺϾƷһ |
ѹۿվ |
AV뾫Ʒ |
AVƷһ |
Ļ߹ۿ |
վɫƵѹۿ45 |
ѹۿĻƷ |
ɫaվ |
ĻкƬ |
պƷרҹ |
avۺavav |
һƵ |
ĻƷһ |
ŮڵƵ |
ɫһվ |
һ߹ۿ |
69paoǿѸ |
Ƶ߹ۿ |
ˮƵwww |
Ʒרһ |
þĻƷһ |
þѹƵ |
ĻСۺ |
ձһ |
2022ѹƷ |
鶹AV뾫Ʒþ |
ҹƵ |
ŮëƬƵƵһ
|
AAѹۿ1000Ӱ |
һɫþ88Ʒۺ |
һѰ |
þþþþþ99Ʒ
|
һҳ |
aëƬ |
˳ӰԺ |
xxxxxӰ |
ԲaëƬ |
ƷƵ |
˾þô߽ӰԺ |