SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

对于Java来说,GUI开发一直都是项比较头疼的事情。从AWT的功能奇缺,到Swing的臃肿不堪,往如梦魇般困扰着Java开发人员。

于是,有一群人开始走向了邪路……

这群误入岐途的人(至少Sun是这么认为的……),走出了自己的一条路,名为SWT(Standard Widget Toolkit)的不归路(Sun,Sun|||)。

说起SWT冒着被诟病为邪恶所换取的,无外以下几点:

1.彻底摒弃了AWT/Swing,某种意义上甚至架空了JVM,比如其通过dispose()即时释放资源。(当然,大家也都知道这意味着什么)

2.功能几乎全用本地系统完成,所以其界面与本地程序界面也高度一致,一改Java GUI的沉闷,令人眼前一亮。

3.支持本地API调用,也就是说无论本地系统能实现什么,都可以通过SWT照样实现出来。

4.使用"用户线程"作为唯一线程,只有在这个线程中才能调用对构件或某些图形API的访问操作,减少图形操作时线程错误。但也允许间接的在非用户线程的进行图形构件的访问操作。

5.在Windows下运行速度有保证,明显超越AWT/Swing,且较稳定。

6.目前已有较丰富的组件库,有JFace等辅助项目,借助于IDE之利,开发GUI程序速度N快……

但是,只所以被称为邪道,也不是空穴来风,它的缺陷也是显而易见的,比如:

1.JNI调用耗费的时间是不能忽略的。JNI调用速度要比普通Java方法调用慢好几倍甚至几十倍。即便是在Java 6中,这种情况并没有改善。且Swing绝大部分是用Java平台模拟出的组件,这个过程都在一个系统平台内完成。而SWT是部分在本地系统完成,部分在Java平台完成,进行操作时要在这两个平台之间需要进行频繁的数据交互。SWT并没有从根本上解决效率问题。

2.Swing可以享受JVM的特殊待遇,进行特殊优化,比如inline,JIT代码,Swing事件队列对于事件的预处理(合并Paint事件,批处理Java 2D光栅指令等),这就像本地组件可以利用操作系统进行优化一样。而SWT由于采用本地操作,无法完成。

3.SWT只能自顶向下地构建GUI。因此,如果没有父容器,子控件也就不存在,父容器无法在以后任意改变。不如AWT/Swing灵活。

4.在目前来讲,SWT还是一个有限的图形环境(Sun,依旧是Sun)。到目前为止,它对于Java2D和Java3D的支持还不怎么好。

5.SWT在Windows下速度虽快,是占了Microsoft提供的大量API之利,在其他平台上则持平或较慢于AWT/Swing。

6.与AWT/Swing不同,SWT和JFace并不是Java技术的标准配置,需要在将JAR文件放到Java CLASSPATH中,并将DLL文件放到系统PATH中才能运行,较AWT/Swing更繁琐,如果某天Sun大神发威,和标准JRE兼容都可能成为问题。

两种论调势成水火,各不相下,似乎都要彻底压到另一方才可罢休。

其实我认为大可不必,使用何种技术,大体上只有开发人员才会关心,技术外的那些才是用户所关心的。开发人员间再怎么争辩,其实在外人眼里都是无意义的窝里斗罢了。

比如,SWT可以包含AWT/Swing,而在AWT/Swing下,要实现SWT的功能也是轻而易举的。

我举几个程序的例子。

AWT/Swing与SWT透明窗体实现的比较:

在SWT中,由于高度集成本地环境,能够完成很多AWT/Swing力所不能及,很Cool的工作,比如半透明的窗体,代码如下:
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体packageorg.loon.framework.dll.test;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.SWT;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.graphics.Point;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.internal.win32.OS;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.internal.win32.TCHAR;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.layout.FillLayout;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.widgets.Display;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.widgets.Shell;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
/***//**
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Title:LoonFramework
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Description:
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Copyright:Copyright(c)2007
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Company:LoonFramework
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@authorchenpeng
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*@email:[email protected]
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@version0.1
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
*/

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicclassSWTTransTest...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
/***//**
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@paramargs
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
*/

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicstaticvoidmain(String[]args)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体Displaydisplay
=newDisplay();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体Shellshell
=newShell(display,SWT.CLOSE);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.setSize(
newPoint(400,400));
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.setLayout(
newFillLayout());
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.setText(
"SWT半透明窗体实现");
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//打开shell
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
shell.open();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//设置窗体透明
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
OS.SetWindowLong(shell.handle,OS.GWL_EXSTYLE,OS.GetWindowLong(
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.handle,OS.GWL_EXSTYLE)
^0x80000);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//loadUser32.dlllib
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
TCHARlpLibFileName=newTCHAR(0,"User32.dll",true);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
inthInst=OS.LoadLibrary(lpLibFileName);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(hInst!=0)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//设定调用函数名称
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
Stringname="SetLayeredWindowAttributes�";
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
byte[]lpProcName=newbyte[name.length()];
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
for(inti=0;i<lpProcName.length;i++)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体lpProcName[i]
=(byte)name.charAt(i);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//检索DLL输出函数地址
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
intfun=OS.GetProcAddress(hInst,lpProcName);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//当函数存在
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(fun!=0)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//150为透明度,在0-255之间
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
OS.CallWindowProc(fun,shell.handle,0,150,2);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//释放lib
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
OS.FreeLibrary(hInst);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
while(!shell.isDisposed())...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(!display.readAndDispatch())...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体display.sleep();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

效果如图:

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

嗯,很简单,很方便.

不过,似乎有个问题,这些反复出现的OS,不就是封装的Win32 API吗?那么,SWT由于依赖本地平台能够实现,那么Swing那种"画"出来的界面可以实现吗?答案是肯定的,事实上,没有一种界面不是系统"画"来的,只要能获得窗体的hWnd,也就是句柄,任何窗体的操作都是张飞吃豆芽-小菜一碟罢了.

下面,我用AWT/Swing完成同样的操作.

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体packageorg.loon.framework.dll.test;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.Frame;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.event.WindowAdapter;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.event.WindowEvent;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjavax.swing.JFrame;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.loon.framework.dll.NativeLoader;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
/***//**
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>Title:LoonFramework</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>Description:AWT/SWing实现真窗体透明</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>Copyright:Copyright(c)2007</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>Company:LoonFramework</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@authorchenpeng
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*@email:[email protected]
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@version0.1
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
*/

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicclassTransTest...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicstaticvoidmain(finalString[]args)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//助于SetLayeredWindowAttributes函数,
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//在Windows下,AWT/SWing要实现不规则窗体、半透明窗体是非常容易的
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
JFrameframe=newJFrame("透明窗体测试");
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//Frameframe=newFrame("透明窗体测试");
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
/**//*frame.addWindowListener(newWindowAdapter(){
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体publicvoidwindowClosing(WindowEventwe){
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体System.exit(0);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体});
*/

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体frame.setVisible(
true);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//NativeLoader为制作好的本地API集合,0.6f为透明度60%显示
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
NativeLoader.getInstance().setTransparence(frame,0.6f);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体frame.setSize(
400,400);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体frame.setLocationRelativeTo(
null);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

效果图:

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

事实上,我们只要在NativeLoader中通过当前object在jawt.dll中的运行时hWnd,(即AWT窗体的hWnd,因为Swing底层是AWT,两者一至),与SWT是没有任何区别的.

再比如在AWT/Swing中,似乎很难实现真正的不规则窗体,充其量只能做一些"伪不规则窗体",而SWT借助本地支持却能轻易实现.

AWT/Swing与SWT不规则窗体实现的比较:

比如SWT实现不规则窗体.

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体packageorg.loon.framework.dll.test;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.SWT;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.graphics.Image;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.graphics.ImageData;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.graphics.Point;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.graphics.Region;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.widgets.Display;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.widgets.Event;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.widgets.Listener;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.eclipse.swt.widgets.Shell;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
/***//**
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Title:LoonFramework
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Description:
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Copyright:Copyright(c)2007
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Company:LoonFramework
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@authorchenpeng
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*@email:[email protected]
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@version0.1
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
*/

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicclassSWTWindowFrm...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
privateShellshell;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
privateDisplaydisplay=Display.getDefault();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
privateImageimage=null;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
privateImageDataimageData=null;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicstaticvoidmain(String[]args)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
try...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWTWindowFrmwindow
=newSWTWindowFrm();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体window.open();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}
catch(Exceptione)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体e.printStackTrace();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicvoidopen()...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体createUI();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.open();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.layout();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
while(!shell.isDisposed())...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(!display.readAndDispatch())
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体display.sleep();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
protectedvoidcreateUI()...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell
=newShell(display,SWT.NO_TRIM);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.setSize(
500,375);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.setText(
"SWT实现不规则窗体");
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体createShell();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体Listenerlistener
=newListener()...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
intstartX,startY;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicvoidhandleEvent(Evente)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//注入鼠标事件
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(e.type==SWT.MouseDown&&e.button==1)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体startX
=e.x;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体startY
=e.y;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(e.type==SWT.MouseMove&&(e.stateMask&SWT.BUTTON1)!=0)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体Pointp
=shell.toDisplay(e.x,e.y);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体p.x
-=startX;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体p.y
-=startY;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.setLocation(p);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(e.type==SWT.Paint)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体e.gc.drawImage(image,imageData.x,imageData.y);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}
;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.addListener(SWT.KeyDown,listener);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.addListener(SWT.MouseDown,listener);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.addListener(SWT.MouseMove,listener);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.addListener(SWT.Paint,listener);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
protectedvoidcreateShell()...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体Stringpath
=this.getClass().getResource("role.gif").getPath();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体image
=newImage(display,newImageData(path));
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体Regionregion
=newRegion();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体imageData
=image.getImageData();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//将255(白色)定为透明区域,镂空
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(imageData.alphaData!=null)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
for(inty=0;y<imageData.height;y++)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
for(intx=0;x<imageData.width;x++)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(imageData.getAlpha(x,y)==255)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体region.add(imageData.x
+x,imageData.y+y,1,1);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}
else...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体ImageDatamask
=imageData.getTransparencyMask();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
for(inty=0;y<mask.height;y++)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
for(intx=0;x<mask.width;x++)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
if(mask.getPixel(x,y)!=0)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体region.add(imageData.x
+x,imageData.y+y,1,1);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.setRegion(region);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体shell.setSize(imageData.x
+imageData.width,imageData.y
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
+imageData.height);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

效果图如下:

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

但是,AWT/Swing做不到吗?我已经说过了,只要能得到句柄,就没有修改不了的窗体存在.而AWT/Swing显然是可以得到运行时本地句柄的.

下面来个AWT/Swing实现:

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体packageorg.loon.framework.dll.test;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.Image;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.Point;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.Window;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.event.FocusEvent;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.event.FocusListener;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.event.MouseEvent;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.event.MouseMotionListener;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.awt.image.BufferedImage;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.io.File;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjava.io.IOException;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importjavax.imageio.ImageIO;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
importorg.loon.framework.dll.win32.UIWindow;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
/***//**
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Title:LoonFramework
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Description:
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Copyright:Copyright(c)2007
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*<p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*Company:LoonFramework
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*</p>
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@authorchenpeng
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*@email:[email protected]
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体*
@version0.1
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
*/

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
//UIWindow为本人提供类,内部已设置255为镂空色
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicclassMyJWindowextendsUIWindowimplementsMouseMotionListener,
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体FocusListener
...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
privatestaticfinallongserialVersionUID=1L;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体PointmousePointer;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicMyJWindow(Imageimg)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
super(img);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体init();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicvoidinit()...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体addMouseMotionListener(
this);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体addFocusListener(
this);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicvoidfocusGained(FocusEventaFocusEvent)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体PointaPoint
=getLocation();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体setLocation(
15000,0);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体setLocation(aPoint);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicvoidfocusLost(FocusEventaFocusEvent)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicvoidmouseDragged(MouseEventaMouseEvent)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体PointaPoint
=aMouseEvent.getPoint();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
intx=getX()+aPoint.x-mousePointer.x;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
inty=getY()+aPoint.y-mousePointer.y;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体setLocation(x,y);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicvoidmouseMoved(MouseEventaMouseEvent)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体mousePointer
=aMouseEvent.getPoint();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
publicstaticvoidmain(String[]args)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体Stringpath
=MyJWindow.class.getResource("role.gif").getPath();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体BufferedImagebackgroundImage
=null;
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
try...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体backgroundImage
=ImageIO.read(newFile(path));
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}
catch(IOExceptione)...{
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体e.printStackTrace();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体Windowwindow
=newMyJWindow(backgroundImage);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体window.setBounds(
0,0,backgroundImage.getWidth(null),backgroundImage
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体.getHeight(
null));
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体window.setLocationRelativeTo(
null);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体window.setVisible(
true);
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体window.validate();
SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体}

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

效果如下图:

SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体

两者有区别吗?

我们可以从此得知,不,可以说确信,在同样利用本地API时,SWT与AWT/Swing相比是没有太大优势的.而且Sun已经开始优化AWT对本地系统的支持,再不久的将来,SWT可能将没有任何优势可言了^^(我是亲Sun一派~)

其中org.loon.framework.dll包下载路径位于:loonframework-dll