`
longgangbai
  • 浏览: 7309312 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

swt/jface 自定义 Dialog

阅读更多

自定义Dialog很简单,下边我们来一步步实现自定义Dialog
一、写一个类,继承自Dialog

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.widgets.Shell;

public class TestDialog extends Dialog {

    
public TestDialog(Shell parentShell) {
        
super(parentShell);
    }

}

好了,写好了,如何运行呢?
再写一个类:

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Test {
    
public static void main(String[] args) {
        Shell shell 
= new Shell();
        TestDialog td 
= new TestDialog(shell);
        td.setBlockOnOpen(
true);
        td.open();
        Display.getCurrent().dispose();
    }

}

好了运行一下看到效果了吧,带有两个button.
二、看到上边的代码是否会想到别的呢?为什么要再写一个类来运行Dialog,不能在内部写个main方法吗?
我们来试一下:
方法一:参考Jface hello world的的写法:

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class TestDialog extends Dialog {

    
public TestDialog(Shell parentShell) {
        
super(parentShell);
    }

    
public static void main(String[] args) {
        TestDialog td 
= new TestDialog(new Shell());
        td.setBlockOnOpen(
true);
        td.open();
        Display.getCurrent().dispose();
    }

}


运行一下看看什么效果,提示找不到main方法。且打印出如下Exception
java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
 at org.eclipse.jface.resource.JFaceResources.getResources(JFaceResources.java:184)
 at org.eclipse.jface.resource.JFaceResources.getImageRegistry(JFaceResources.java:310)
 at org.eclipse.jface.dialogs.Dialog.<clinit>(Dialog.java:211)
Exception in thread "main"
为什么呢?我们是有main方法的,跟进Exception去看看吧。
发现问题出现在Dialog类的这段代码上:

static {
        ImageRegistry reg 
= JFaceResources.getImageRegistry();
        reg.put(DLG_IMG_MESSAGE_INFO, ImageDescriptor.createFromFile(
                Dialog.
class"images/message_info.gif")); //$NON-NLS-1$
        reg.put(DLG_IMG_MESSAGE_WARNING, ImageDescriptor.createFromFile(
                Dialog.
class"images/message_warning.gif")); //$NON-NLS-1$
        reg.put(DLG_IMG_MESSAGE_ERROR, ImageDescriptor.createFromFile(
                Dialog.
class"images/message_error.gif")); //$NON-NLS-1$
    }

原来在静态代码块上出现了Exception,造成在运行main函数之前就退出了。所以才说没有main函数。
我们知道classload在加载一个类的时候,对于静态代码块会逐行执行,按照出现的先后顺序。同时父类的静态代码块一定比子类的先执行。因为
在load子类之前会先load父类。这就是为什么hello world中不会出现问题,这里会出现问题的原因。因为Dialog比ApplicationWindow多了这段静态代码。

继续追下去为什么这段代码会出现空指针异常呢,原来这段代码依赖于new Shell()必须先运行。而我们的new Shell()写在main方法里边,肯定是在加载类完成后才能运行的。所以在类内部直接写个main方法是不行的。只能单独写个类来调用。
方法二:
单独写个类如下:

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Test {
    
public static void main(String[] args) {
        TestDialog td 
= new TestDialog(new Shell());
        td.setBlockOnOpen(
true);
        td.open();
        Display.getCurrent().dispose();
    }

}

依然是不行的,报同样的错误,为什么?仔细看一下,我们把new Shell()写在构造函数的参数里,其实范了和刚才同样的错误。所以单独提出new Shell(),写在构造函数之前。就得到了文章开始的Test类。平时我们使用的时候为什么不出这个问题呢?因为我们平时使用的时候Dialog从里不是单独存在的,在之前shell早被构造过了。反而是demo更容易出这个问题。
好了,上边只是个小插曲,继续我们的自定义Dialog.
三、去掉两个按钮
虽然Dialog天生带的两个按钮不错,但我们有的时候并不想要这两个按钮,怎么办,如何去掉它?
简单,只要我们覆盖父类的createButtonsForButtonBar这个方法就可以了,覆写这个方法,里边什么也不写

protected void createButtonsForButtonBar(Composite parent) {
    }


看一下按钮消失了。
四、加入右上角的最大化和关闭
覆写父类的这个方法:

protected int getShellStyle(){
        
return super.getShellStyle()|SWT.RESIZE|SWT.MAX;
    }


五、改变Dialog的大小
覆写这个方法:

protected Point getInitialSize(){
        
return new Point(300,400);//300是宽400是高
    }

六、加入自己的控件
覆写createDialogArea方法

protected Control createDialogArea(Composite parent) {
        Composite container 
= (Composite) super.createDialogArea(parent);
        container.setLayout(
new RowLayout());
        text 
= new Text(container, SWT.BORDER);
        text.setLayoutData(
new RowData(100,-1));
        
return container;
    }


这里使用了RowLayout
七、加入自己的按钮
覆写initializeBounds

protected void initializeBounds(){
        Composite comp 
= (Composite)getButtonBar();
        
super.createButton(comp, IDialogConstants.OK_ID, "完成"true);
    }

好了这里自定义Dialog完成了,然后根据你的需要再Dialog中添加更负载的控件,更多的按钮。最后目的当然是从Dialog取道数值。
八、带提示框的Dialog
使用方法和前边相同,不同的是不是继承自Dialog而是继承自TitleAreaDialog,然后在createDialogArea中加入两行

setTitle("标题");
setMessage(
"提示信息")
//setMessage可以加上图片,加入的办法是setMessage("提示信息",IMessageProvider.WARNING);如果想加入其他的图片,调用相应的常量。
分享到:
评论

相关推荐

    SWT/JFACE客户端登录窗口例子

    5. **对话框(Dialog)**:登录窗口可能是一个独立的 `Dialog` 对象,它继承自 `org.eclipse.jface.dialogs.Dialog` 类。对话框提供了一种方便的方式,让用户在主应用程序窗口之外输入信息,且可以自定义其大小、...

    SWT/JFace从入门到精通

    - 创建自定义视图:学习如何在Eclipse中创建一个新的View,并使用SWT/JFace控件展示数据。 - 实现对话框:创建一个带有输入框和确认按钮的对话框,用于获取用户输入并进行处理。 7. 进阶主题 - 菜单和工具栏:...

    Eclipse swt/jface核心应用源码(带视频)

    6. **对话框**:使用JFace的`Dialog`类创建自定义对话框,如`MessageDialog`, `InputDialog`等。 7. **模型-视图-控制器**:理解MVC模式在JFace中的应用,以及如何分离业务逻辑和用户界面。 8. **工作流和命令**:...

    SWT/JFACE API

    4. **视图和对话框**:JFace提供了`ViewPart`, `Dialog`等类,用于创建自定义的视图和对话框,这些类简化了窗口的生命周期管理和布局管理。 5. **树和表控件**:JFace的`TreeViewer`和`TableViewer`提供了更高级别的...

    swt/jface api帮助文档

    4. **颜色和字体**:SWT允许开发者自定义控件的颜色和字体,以实现个性化的用户界面。 5. **对话框**:SWT提供标准的对话框组件,如MessageDialog、FileDialog和ColorDialog,方便开发者快速创建常见的对话框。 6....

    SWT/JFace开发入门指南

    ### SWT/JFace开发入门指南知识点解析 #### 一、SWT/JFace简介及目标受众 - **SWT**(Standard Widget Toolkit)与 **JFace** 是 Eclipse 平台中的两个重要组成部分,主要用于创建桌面应用程序的用户界面。 - 本...

    SWT/JFace官方实例

    JFace 提供了标准对话框的实现,如 MessageDialog、InputDialog 和 SelectionDialog 等,实例会展示如何创建和使用这些对话框。 6. **表和树**:SWT 和 JFace 支持复杂的数据展示,如表格(Table)和树形结构(Tree...

    SWT/JFace 控件实例

    这涉及到SWT的Shell(顶级窗口)、Composite(复合控件)、Button和Text控件的使用,以及JFace的Dialog和Event Handling机制。 另一个例子可能是关于数据绑定,展示如何将SWT表格与Java对象的数据模型进行关联,使...

    Eclipse Swt/Jface核心应用 (23-25章_end)

    Eclipse SWT(Standard Widget Toolkit)和JFace是用于构建Java GUI应用程序的强大工具,它们与Eclipse IDE紧密集成,提供了一套高效、可扩展且平台独立的用户界面组件。本资源包含23至25章的核心应用,以下是这些...

    Eclipse SWT/JFace核心应用2

    JFace的核心组件包括视图(View)、编辑器(Editor)、对话框(Dialog)和表单(Form)。同时,JFace的Data Binding机制使得数据模型与用户界面之间的同步变得容易,增强了可维护性和可扩展性。 在Eclipse RCP中,...

    Jface/swt学生成绩管理程序

    SWT提供了标准的对话框组件,如InputDialog和FileDialog,也可以自定义对话框以满足特定需求。 7. **异常处理**:在处理用户输入和数据库操作时,需要考虑异常处理,确保程序的健壮性。通过try-catch-finally结构,...

    Java swt完整教程

    JFace是建立在SWT之上的抽象层,简化了SWT的使用,提供了一些高级组件,如对话框(Dialog)、视图(View)、编辑器(Editor)等。同时,JFace还提供数据绑定、表单构建等功能。 6. SWT与Eclipse RCP Eclipse Rich...

    swt&jface api

    9. 工具栏和菜单:展示了如何使用SWT和JFace创建自定义的工具栏和菜单,以及添加快捷键。 10. 资源管理:讲解如何管理和释放应用程序使用的资源,如图片、字体等。 通过深入学习和理解SWT和JFace API,开发者可以...

    SWT和JFace开发实例

    - 创建自定义对话框,如使用Dialog和Shell类。 - 事件驱动编程,实现用户交互响应。 - 使用Action和Command模式进行命令管理,提高代码复用性。 - 实现文件I/O操作,如读取和保存文件。 通过学习和实践这些实例...

    SWT And JFace

    《SWT与JFace完全指南》是一本深入探讨Java GUI编程技术的专业书籍,主要围绕SWT(Standard Widget Toolkit)和JFace两个库展开。这两者是Eclipse IDE的基础组件,用于构建用户界面,提供了丰富的控件和强大的功能,...

    SWT eclipse Jface API

    `org.eclipse.jface.dialogs.Dialog`则是一系列对话框的基类,可以方便地创建自定义对话框。 在压缩包中的`swt.CHM`文件很可能是一个帮助文档,包含了SWT的详细API参考。这类文档通常会列出每个类、接口、方法的...

    人邮版-王津涛-EclipseSWTJFACE开发实战精解-光盘代码.rar

    5. **对话框和表单**:掌握如何利用JFace的Dialog和Form工具类来创建各种对话框和表单,提高用户交互体验。 6. **事件处理**:理解Eclipse事件模型,学会如何注册事件监听器,处理用户交互事件。 7. **插件结构**...

    Eclipse SWT,JFace开发实战精解 书中

    例如,可以使用SWT的Composite类来组合多个控件,构建自定义组件;使用JFace的Dialog类来创建模态对话框,展示信息或获取用户输入;利用TreeViewer和TableViewer来显示和操作数据集合,提供强大的数据浏览和编辑功能...

    SWT,JFACE核心应用源代码,第二部分.rar

    5. 对话框和窗口:查看如何使用JFace的Dialog类创建自定义对话框,以及如何在应用程序中使用Window类。 6. 高级组件:学习如何使用SWT中的高级组件,如TreeViewer、TableViewer等,以及如何自定义其行为。 总之,...

    Eclipse_Swt_Jface_核心应用_部分19

    1.6 SWT与JFace、Eclipse 9 1.6.1 JFace是SWT的扩展 9 1.6.2 Eclipse的UI界面基于JFace 10 1.7 本章小结 10 第2章 配置SWT开发环境 11 2.1 下载和安装Eclipse 11 2.1.1 Eclipse下载页面介绍 11 2.1.2 ...

Global site tag (gtag.js) - Google Analytics