转自:http://www.cnblogs.com/AllenYoung/archive/2006/10/05/521805.html
Dialog是SWT和JFace的一个重要的组成部分,我们在开发Plug-in或RCP的时候也经常会用到它们。这篇随笔不会介绍 SWT的Dialog,因为我想很多人都已经非常熟悉它了。在这里,我要讨论的是JFace的Dialog,或者更进一步说是JFace的 TitleAreaDialog。什么是TitleAreaDialog呢?想想我们常常用到的New XX Wizard就知道了。在我们创建一个Java Project或Class的时候,我们所使用的Wizard其实就是由TitleAreaDialog构成的。这种Dialog有如下所示的 TitleArea和一个标准的Button Bar:
正常的TitleArea 带有错误信息的TitleArea
标准的Button Bar
这种GUI的表现力要比SWT的Dialog强很多,而且JFace为该 Dialog封装了很多东西,这也使开发工作变得更加简单,所以我极力推荐使用TitleAreaDialog。那么让我们来看一个最基本的 TitleAreaDialog:
importorg.eclipse.jface.dialogs.TitleAreaDialog;
importorg.eclipse.swt.SWT;
importorg.eclipse.swt.graphics.Point;
importorg.eclipse.swt.layout.GridData;
importorg.eclipse.swt.widgets.Composite;
importorg.eclipse.swt.widgets.Control;
importorg.eclipse.swt.widgets.Shell;
importorg.jthin.jpssp.ide.configuration.Activator;
publicclassMyTitleAreaDialogextendsTitleAreaDialog{
/**
*Createthedialog
*
*@paramparentShell
*/
publicMyTitleAreaDialog(ShellparentShell){
super(parentShell);
}
/*
*(non-Javadoc)
*
*@seeorg.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protectedControlcreateDialogArea(Compositeparent){
Compositearea=(Composite)super.createDialogArea(parent);
Compositecontainer=newComposite(area,SWT.NONE);
container.setLayoutData(newGridData(GridData.FILL_BOTH));
//TitleArea中的Title
setTitle("MyTitleAreaDialog");
//TitleArea中的Message
setMessage("ThisisasimpleTitleAreaDialogexample.");
//TitleArea中的Image
setTitleImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/Neptune.png"));
returnarea;
}
/*
*(non-Javadoc)
*
*@seeorg.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
protectedvoidcreateButtonsForButtonBar(Compositeparent){
createButton(parent,IDialogConstants.OK_ID,IDialogConstants.OK_LABEL,true);
createButton(parent,IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL,false);
}
/*
*(non-Javadoc)
*
*@seeorg.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize()
*/
protectedPointgetInitialSize(){
returnnewPoint(500,375);
}
/*
*(non-Javadoc)
*
*@seeorg.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protectedvoidconfigureShell(ShellnewShell){
super.configureShell(newShell);
//DialogTitle
newShell.setText("TestTitleAreaDialogTitle");
//DialogIcon
newShell.setImage(ResourceManager.getPluginImage(Activator.getDefault(),"icons/Neptune.png"));
}
}
这段代码非常容易理解,从方法签名中可以看出每个方法做了什么事情。注意createButtonsForButtonBar方法,其中用createButton方法创建了OK和Cancel这两个Button,并且把Button的默认点击事件也写好了,就是关闭该 Dialog。ResourceManager.getPluginImage是我自己编写的获得图片的helper method,这里就不讨论其实现了。这段代码会产生如下的Dialog:
有趣的是,我在这里故意使用了一个128×128的大图标, TitleAreaDialog不会自动缩小或裁减Image,而是调整TitleArea的大小来适应Image。
接下来我们要为OK Button编写我们自己的事件,例如把用户在Dialog中的输入保存到某处。有人可能会想到为OK Button添加SelectionListener,但实际上这样做是不对的,因为OK Button是JFace为Dialog封装好了的,同时JFace也提供了响应的callback:
*(non-Javadoc)
*
*@seeorg.eclipse.jface.dialogs.Dialog#okPressed()
*/
protectedvoidokPressed(){
//implementyourownfunctionhere
super.okPressed();
}
我们可以在这里实现我们自己的事件,不过最后一定要调用super.okPressed方法,否则Dialog就不会关闭了。
OK,以上就是TitleAreaDialog的基本Framework,非常容易理解,下面我们就来在 TitleArea中动态设置一些信息。你可以把这个scenario想象成在用户输入的同时提示用户输入的合法性。TitleAreaDialog提供了好3个方法可以动态设置TitleArea信息,具体如下:
- public void setErrorMessage(String newErrorMessage):显示传入的错误信息。(我们把用这个方法设置的信息叫做error message。)当前显示的信息会被保存起来,等到error message清空之后会再次显示,而清空error message要传入null,而不是传入空字符串。
- setMessage(String newMessage):显示传入的信息,等同于setMessage(String newMessage, IMessageProvider.NONE)。如果当前显示的是error message,那么newMessage会被保存起来,等到error message清空后再显示。
-
setMessage(String newMessage, int newType):显示传入的信息,并显示指定的信息类型。可用的类型有NONE、INFORMATION、WARNING和ERROR。需要注意的是, setMessage(String newMessage, intIMessageProvider.ERROR)和setErrorMessage(String newErrorMessage)并不相同。后者会覆盖当前的任何信息,而前者只会覆盖当前的非error message,不会影响到error message(也就是说当error message清空后才会显示)。
这样,我们就可以为一些文本框添加ModifyListener,然后在其中设置TitleArea的信息了。
接着,再让我们来看看Button Bar。有些时候,我们希望把OK和Cancel这种默认的Button放置在Button Bar的右侧,而把其他Button放置在Button Bar的左侧,如下图中的Customize... Button:
这又如何实现呢?有人可能想到在 createButtonsForButtonBar方法中做一些手脚,但是遗憾的是这行不通,我们真正要覆写的是createButtonBar方法,下面是一个简单的例子:
*(non-Javadoc)
*
*@seeorg.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
*/
protectedControlcreateButtonBar(Compositeparent){
Compositecomposite=newComposite(parent,SWT.NONE);
GridLayoutlayout=newGridLayout();
layout.numColumns=0;
layout.marginHeight=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
composite.setLayout(layout);
composite.setLayoutData(newGridData(GridData.FILL_HORIZONTAL));
if(isHelpAvailable()){
createHelpControl(composite);
}
createButton(composite, MyConstants.IMPORT_BUTTON_ID,"Import",false).addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(SelectionEvente){
MessageDialog.openInformation(MaintainModuleDialog.this.getShell(),"Information",
"\"Import\"buttonhasnotbeenimplemented.");
}
});
createButton(composite, MyConstants.EXPORT_BUTTON_ID,"Export",false).addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(SelectionEvente){
MessageDialog.openInformation(MaintainModuleDialog.this.getShell(),"Information",
"\"Export\"buttonhasnotbeenimplemented.");
}
});
createButton(composite, MyConstants.OTHER_BUTTON_ID,"Other",false).addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(SelectionEvente){
MessageDialog.openInformation(MaintainModuleDialog.this.getShell(),"Information",
"\"Other\"buttonhasnotbeenimplemented.");
}
});
Labelfiller=newLabel(composite,SWT.NONE);
filler.setLayoutData(newGridData(GridData.FILL_HORIZONTAL|GridData.GRAB_HORIZONTAL));
layout.numColumns++;
super.createButtonsForButtonBar(composite);
returncomposite;
}
正如你所见,我们实际上创建了自己的Button Bar,然后在上面添加了3个Button:Import、Export和Other,最后 super.createButtonsForButtonBar会创建OK和Cancel Button。filler是用来在两组Button见占位的。代码中用到的两个convert方法来自 org.eclipse.jface.dialogs.Dialog类,你还可以在这个类中找到一个getButton(int)方法,它可以根据传入的 ID返回用createButton创建的Button。这些都是非常实用的方法。
回头看一下上面那个完整的 TitleAreaDialog图片,你会看到在Dialog左下角有一个问号符号,这其实是一个Button,点击它可以显示帮助信息,当然帮助信息是由你来创建的。让我们看看Eclipse Search的TitleAreaDialog中的帮助信息吧:
如果我们也想实现这种帮助机制,那么就要实现如下方法:
*(non-Javadoc)
*
*@seeorg.eclipse.jface.dialogs.TrayDialog#createHelpControl(org.eclipse.swt.widgets.Composite)
*/
protectedControlcreateHelpControl(Compositeparent){
//TODOAuto-generatedmethodstub
returnsuper.createHelpControl(parent);
}
如果不想实现帮助机制,那么最好不要在Dialog中显示出那个问号符号,你可以覆写如下方法并永远返回false,这样就不会显示问号符号了。
*(non-Javadoc)
*
*@seeorg.eclipse.jface.dialogs.TrayDialog#isHelpAvailable()
*/
publicbooleanisHelpAvailable(){
returnfalse;
}
那么这个酷酷的帮助机制到底是个什么东西呢?实际上,它的学名叫做DialogTray。TitleAreaDialog继承了org.eclipse.jface.dialogs.TrayDialog类,而TrayDialog就可以显示这种 DialogTray,是不是有点儿拗口呢?实际上,我们不仅仅可以添加帮助信息这一种DialogTray,还可以添加任意的DialogTray,现在就让我们动手实现一个最简单的吧。代码很简单,最主要的就是要实现一个DialogTray,代码如下:
importorg.eclipse.swt.SWT;
importorg.eclipse.swt.layout.GridData;
importorg.eclipse.swt.layout.GridLayout;
importorg.eclipse.swt.widgets.Composite;
importorg.eclipse.swt.widgets.Control;
importorg.eclipse.swt.widgets.Label;
importorg.eclipse.swt.widgets.Text;
publicclassMyDialogTrayextendsDialogTray{
/*
*(non-Javadoc)
*
*@seeorg.eclipse.jface.dialogs.DialogTray#createContents(org.eclipse.swt.widgets.Composite)
*/
protectedControlcreateContents(Compositeparent){
Compositecontainer=newComposite(parent,SWT.NONE);
finalGridLayoutgridLayout=newGridLayout();
gridLayout.numColumns=2;
container.setLayout(gridLayout);
finalLabellabel=newLabel(container,SWT.NONE);
label.setText("Name:");
finalTexttext=newText(container,SWT.BORDER);
text.setLayoutData(newGridData(SWT.FILL,SWT.CENTER,true,false));
returncontainer;
}
}
我们只在其中创建了一个Label和一个Text,这就足够了。最后,我们为MyTitleAreaDialog添加两个Button,用来打开和关闭MyDialogTray,代码如下:
openTrayButton.setText("OpenTray");
finalButtoncloseTrayButton=newButton(container,SWT.NONE);
closeTrayButton.setText("CloseTray");
closeTrayButton.setEnabled(false);
openTrayButton.addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(finalSelectionEvente){
//thismethodisfromTrayDialog
openTray(newMyDialogTray());
openTrayButton.setEnabled(false);
closeTrayButton.setEnabled(true);
}
});
closeTrayButton.addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(finalSelectionEvente){
//thismethodisfromTrayDialog
closeTray();
openTrayButton.setEnabled(true);
closeTrayButton.setEnabled(false);
}
});
最后我们会得到如下对话框:
好了,就讲这么多吧。如果能把这些东东适当地用在你的Application中,那么效果一定非常棒。
相关推荐
**SWT(Standard Widget Toolkit)**是Java编程中用于创建图形用户界面(GUI)的一种开源库,它是IBM为对抗Java AWT和Swing而推出的。SWT直接与操作系统API交互,因此可以提供更快的性能和更原生的外观。Eclipse IDE...
SWT详解,详细描述了SWT的原理,希望能帮助你解决问题,哈哈。
标题“swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位”表明这个压缩包包含了适用于64位Windows操作系统的SWT库。描述中提到的“64位windows操作系统使用的SWT库”进一步确认了这一点。 SWT的设计目标是...
### SWT配置详解 #### 一、SWT简介与配置的重要性 SWT(Standard Widget Toolkit)是一种用于构建基于Java的应用程序的图形用户界面工具包。它提供了丰富的控件集,并能够生成本地外观和感觉的界面,这使得应用在...
下面我们将按照步骤进行详解。 首先,你需要确保已经下载了SWTDesigner_v7.6.0的安装包,通常包含`features`和`plugins`两个文件夹。在开始安装前,请确保MyEclipse 8.6.1已正确安装并可以正常运行。 1. 找到并...
SWT(Standard Widget Toolkit)是Eclipse项目的一个重要组成部分,它提供了一套用于构建图形用户界面(GUI)的API,与Java Swing不同,SWT基于操作系统原生的UI组件,因此能够实现更好的性能和与操作系统的集成。...
SWT 资源释放问题详解 SWT(Standard Widget Toolkit)是一种基于 Java 的 GUI 工具包,提供了丰富的图形用户界面组件和事件处理机制。但是, SWT 中的资源释放问题是一件棘手的事情。如果不正确地释放资源,可能...
### SWT的SHELL样式详解 #### 一、SWT.SHELL样式概述 SWT(Standard Widget Toolkit)是Eclipse平台上用于构建用户界面的一种强大的工具包。它提供了丰富的控件和功能,可以创建出高性能且美观的图形用户界面。在...
下载编译的SWT库,版本号4.911,包含多个版本: org.eclipse.swt.cocoa.macosx.x86_64 org.eclipse.swt.gtk.linux.aarch64 org.eclipse.swt.gtk.linux.arm org.eclipse.swt.gtk.linux.ppc64le org.eclipse.swt.gtk....
### SWT JFace 按键、事件、监听 #### 概述 SWT(Standard Widget Toolkit)是Eclipse平台下的图形界面开发工具包,而JFace则是基于SWT之上的高级用户界面工具集。SWT提供了低级别的组件,用于创建跨平台的图形...
【标题】"swt-api swt DOC" 指的是一个关于SWT(Standard Widget Toolkit)API的文档,主要用于Java GUI(图形用户界面)开发。这个文档可能是开发者们在使用SWT进行界面设计时的重要参考资料。 【描述】"java界面...
**SwTDesigner详解** SwTDesigner是一款强大的Eclipse插件,专为Java SE开发者设计,用于构建和设计基于Swing的图形用户界面(GUI)。这款工具以其易用性和功能强大而备受赞誉,极大地简化了在Eclipse环境中创建...
在本文中,我们将深入探讨SWT(Standard Widget Toolkit)的应用,以及如何在Java应用程序中使用它。SWT是由IBM公司为Eclipse集成开发环境设计的一种图形用户界面(GUI)工具包,它通过JNI(Java Native Interface)...
SWT(Standard Widget Toolkit)是Java编程环境中一个用于创建图形用户界面(GUI)的开源库。它是Eclipse项目的一部分,旨在提供与操作系统更紧密的集成,使得开发者可以创建原生外观的应用程序。SWT提供了丰富的...
Java SWT(Standard Widget Toolkit)是Java平台上用于创建桌面应用程序的一个库,它提供了丰富的用户界面元素,如按钮、文本框、列表等。SWT是Eclipse IDE的基础,它通过与操作系统直接交互来提供本地化的图形用户...
Java平台上的图形用户界面(GUI)开发通常依赖于各种库和框架,DJNativeSwing和SWT(Standard Widget Toolkit)是其中两个重要的组件。本文将详细介绍这三个提及的JAR文件以及它们在Java应用中的作用。 首先,...
### SWT Table单元格编辑功能详解 在Java图形用户界面(GUI)开发中,SWT(Standard Widget Toolkit)是一个广泛使用的工具包,它提供了丰富的控件集合,用于构建高性能的桌面应用程序。其中,`Table`控件是SWT中最...
根据提供的文件信息,可以看出本文主要讨论的是如何在 SWT (Standard Widget Toolkit) 的 Table 控件中实现文本换行的功能。SWT 是一个用于开发基于 Java 的桌面应用程序的工具包,它提供了丰富的用户界面组件来帮助...
SWT examples,SWT官方例子:http://www.eclipse.org/swt/examples.php 该页面所要下载的例子 其中,swt的例子在\plugins\org.eclipse.swt.examples.source_3.7.0.v3740f.jar中
【SWT Designer 详解】 SWT (Standard Widget Toolkit) 是一个用于开发 Java 桌面应用程序的图形用户界面 (GUI) 工具包,而 SWT Designer 是一款基于 Eclipse 的插件,它为开发者提供了图形化的界面来设计和构建 ...