关于JFace的自定义对话框(Dialog类)

时间:2022-10-09 22:45:11

仅仅是使用MessageDialog,InputDialog等JFace中现成的对话框类是无法满足实际项目开发需要的.

很多时候都需要自己定制对话框,自定义对话框只要在Dialog类的基础上作扩展就行了.

1.起步:扩展Dialog类

 //注意:JFace包和SWT包都有一个Dialog类,我们继承的是JFace的
public class MyDialog extends Dialog {
public MyDialog(Shell parentShell) {
super(parentShell);
}
// 在这个方法里构建Dialog中的界面内容
@Override
protected Control createDialogArea(Composite parent) {
// 建议不要直接在parent上创建组件,否则容易导致界面布局混乱。 应该象本例一样再叠加一个topComp面板,然后在此面板创建及布局
return null; }
}

"@Override"是JDK5.0的注解标签,表示该方法必须是改写自父类的方法,该注解可要可不要,不影响程序的运行.以上代码建立了一个叫做MuyDialog的自定义对话框,,他的使用方法和JFace自带的InputDialog一样.如下:

        // ---------创建窗口中的其他界面组件-------------
MyDialog dialog = new MyDialog(shell);
dialog.open();

运行结果:

关于JFace的自定义对话框(Dialog类)

2.创建界面组件.

现在通过在createDialogArea方法中写入代码,来给MyDialog加入界面组件,这些代码和以前的界面方法是一样的,只不过以前是用Shell作为容器创建的组件,现在则是在createDialogArea方法参数提供的"Composite parent"容器上创建组件.

对于createDialogArea()方法修改如下:

     // 在这个方法里构建Dialog中的界面内容
@Override
protected Control createDialogArea(Composite parent) {
// 建议不要直接在parent上创建组件,否则容易导致界面布局混乱。 应该象本例一样再叠加一个topComp面板,然后在此面板创建及布局
Composite topComp = new Composite(parent, SWT.NONE);
topComp.setLayout(new RowLayout());// 应用RowLayout面局
new Label(topComp, SWT.NONE).setText("请输入:");// 加入一个文本标签
Text text = new Text(topComp, SWT.BORDER);// 加入一个文本框
text.setLayoutData(new RowData(100, -1));// 用RowData来设置文本框的长度
return topComp;
}

createDialogArea方法的返回值类型要求是Control,其谱系图如下所示:

关于JFace的自定义对话框(Dialog类)

可见Composite是Control的子类,所以上面的程序中返回topComp对象也是可以的.

运行结果:

关于JFace的自定义对话框(Dialog类)

3.

改变对话框的式样:

上面的运行结果在对话框右上角只有一个关闭按钮,如果想让器其有最小化,最大化按钮,并且窗口可用鼠标改变大小,则只需要再MyDialog类中改写父类的getShellStyle方法即可,如果让此方法只返回SWT.NONE式样,则得到如下的结果.代码如下:

如果是这个设置return super.getShellStyle();  或者是 return super.getShellStyle() |SWT.NONE;
对应的输入框如下:

关于JFace的自定义对话框(Dialog类)

     // 改写父类Dialog的getShellStyle方法可以改变窗口的默认式样
@Override
protected int getShellStyle() {
// 用super.getShellStyle()得到原有式样,再附加上两个新式样
return super.getShellStyle() | SWT.RESIZE | SWT.MAX;
//return super.getShellStyle();
}
 如果是这个设置return super.getShellStyle() | SWT.RESIZE | SWT.MAX;
对应的输入框如下:

关于JFace的自定义对话框(Dialog类)

4.定制对话框的按钮:

如果想在对话框中增加按钮,则需要改写父类的initializeBounds方法,如果还想改变"确定,取消"两个按钮的名称,则需要再改写父类的createButton方法,让它空实现,

如下图:

关于JFace的自定义对话框(Dialog类)

     // 改写父类创建按钮的方法使其失效。参数parent:取得放置按钮的面板;参数id:定义按钮的ID值;
// 参数label:按钮文字;参数defaultButton:是否为Dialog的默认按钮。
protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
return null;
} // 改写父类的initializeBounds方法,并调用父类的createButton方法建立按钮
public static final int APPLY_ID = 101; // 定义好“应用”按钮的ID值(整型常量) protected void initializeBounds() {
Composite comp = (Composite) getButtonBar();// 取得按钮面板
super.createButton(comp, APPLY_ID, "应用", true);
super.createButton(comp, IDialogConstants.OK_ID, "真的", false);
super.createButton(comp, IDialogConstants.CANCEL_ID, "算了", false);
super.initializeBounds();
}

5.改变自定义对话框的大小

在类中改写父类的getInitialSize即可,代码如下:

    // 改变对话框大小为宽300,高400(单位:像素)
protected Point getInitialSize() {
return new Point(300, 400);// super.getInitialSize()可以得到原来对话框的大小
}

如上的两个MyDialog.java和MyDialogClient.java

MyDialog.java

 package cn.com.chengang.jface.dialog;

 import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text; //注意:JFace包和SWT包都有一个Dialog类,我们继承的是JFace的
public class MyDialog extends Dialog {
public MyDialog(Shell parentShell) {
super(parentShell);
} // 在这个方法里构建Dialog中的界面内容
@Override
protected Control createDialogArea(Composite parent) {
// 建议不要直接在parent上创建组件,否则容易导致界面布局混乱。 应该象本例一样再叠加一个topComp面板,然后在此面板创建及布局
Composite topComp = new Composite(parent, SWT.NONE);
topComp.setLayout(new RowLayout());// 应用RowLayout面局
new Label(topComp, SWT.NONE).setText("请输入:");// 加入一个文本标签
Text text = new Text(topComp, SWT.BORDER);// 加入一个文本框
text.setLayoutData(new RowData(100, -1));// 用RowData来设置文本框的长度
return topComp;
} // 改写父类Dialog的getShellStyle方法可以改变窗口的默认式样
@Override
protected int getShellStyle() {
// 用super.getShellStyle()得到原有式样,再附加上两个新式样
return super.getShellStyle() | SWT.RESIZE | SWT.MAX;
} // 改写父类创建按钮的方法使其失效。参数parent:取得放置按钮的面板;参数id:定义按钮的ID值;
// 参数label:按钮文字;参数defaultButton:是否为Dialog的默认按钮。
protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
return null;
} // 改写父类的initializeBounds方法,并调用父类的createButton方法建立按钮
public static final int APPLY_ID = 101; // 定义好“应用”按钮的ID值(整型常量) protected void initializeBounds() {
Composite comp = (Composite) getButtonBar();// 取得按钮面板
super.createButton(comp, APPLY_ID, "应用", true);
super.createButton(comp, IDialogConstants.OK_ID, "真的", false);
super.createButton(comp, IDialogConstants.CANCEL_ID, "算了", false);
super.initializeBounds();
} // 改变对话框大小为宽300,高400(单位:像素)
protected Point getInitialSize() {
return new Point(300, 400);// super.getInitialSize()可以得到原来对话框的大小
} }

MyDialogClient.java

 package cn.com.chengang.jface.dialog;

 import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell; //注意:JFace包和SWT包都有一个Dialog类,我们继承的是JFace的
public class MyDialogClient {
public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(327, 253);
// ---------创建窗口中的其他界面组件-------------
MyDialog dialog = new MyDialog(shell);
dialog.open();
// -----------------END------------------------
shell.dispose();
display.dispose();
}
}

运行结果:

关于JFace的自定义对话框(Dialog类)

对话框的设置与取值:

在实际开发中,经常需要设置对话框中的组件的初始值,并在单击对话框的"确定"按钮后,取出对话框中的值进行相应的处理.实现对话框设置取值的关键是为各组件创建对应的变量来保存值.如下MyDialog2类所示:

MyDialog2.java

 package cn.com.chengang.jface.dialog;

 import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text; public class MyDialog2 extends Dialog {
private String textValue; // 用来保存Text值的变量
private Text text;// 将文本写为类实例变量,否则其他方法无法访问它 public MyDialog2(Shell parentShell) {
super(parentShell);
} public String getTextValue() {
return this.textValue;
} public void setTextValue(String value) {
this.textValue = value;
} // 在这个方法里构建Dialog中的界面内容
protected Control createDialogArea(Composite parent) {
Composite topComp = new Composite(parent, SWT.NONE);
topComp.setLayout(new RowLayout());
new Label(topComp, SWT.NONE).setText("请输入:");
text = new Text(topComp, SWT.BORDER);
// 把textValue设给Text作为初值,这时要注意对textValue作空值判断,给文本框设置空值是会出错的
text.setText(textValue == null ? "" : textValue);
text.setLayoutData(new RowData(100, -1));
return topComp;
} // 单击对话框底部按钮会执行此方法,参数buttonId是被单击按钮的ID值。
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID)// 如果单击确定按钮,则将值保存到变量
textValue = text.getText();
super.buttonPressed(buttonId);
}
}

MyDialog2Client.java

 package cn.com.chengang.jface.dialog;

 import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell; public class MyDialog2Client {
public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(327, 253);
// ---------创建窗口中的其他界面组件-------------
MyDialog2 dialog = new MyDialog2(shell);
dialog.setTextValue("你好,中国"); // 设值
if (dialog.open() == IDialogConstants.OK_ID) {// 是否单击“确定”按钮
String str = dialog.getTextValue(); // 取值
System.out.println(str);
}
// -----------------END------------------------
shell.dispose();
display.dispose();
}
}

运行结果:

关于JFace的自定义对话框(Dialog类)

点击OK按钮:

关于JFace的自定义对话框(Dialog类)

也许有读者会问:为什么要在MyDialog2.java类中多加上一个textValue变量呢?难道直接对文本框对象text进行操作不行吗?例如text对象改成public前缀,然后如下使用:

MyDialog2.java中 先把text对象变成public类型的.

public Text text;
MyDialog2Client.java
// ---------创建窗口中的其他界面组件-------------
MyDialog2 dialog = new MyDialog2(shell);
dialog.setTextValue("你好,中国"); // 设值
if (dialog.open() == IDialogConstants.OK_ID) {// 是否单击“确定”按钮
String str = dialog.text.getText();//取值
System.out.println(str);
}

上面的代码好像简洁了不少,可惜这样是行不通的.

弹出对话框之后点击OK,在控制台抛出的错误:

关于JFace的自定义对话框(Dialog类)

因为在执行dialog. open()方法之前,对话框界面上的组件还没有创建,text文本框对象是空值,因此,dialog.text.setText()这一句会报出NullPointerException异常.

当单击"确定"按钮对话框退出,这时对话框中的组件将被销毁,所以对text做取值操作 也会包NullPointerException异常.正是由于这些原因,才不得不建立一个String类型的实例变量来保存文本框值做中转.

封装对话框中的数据到一个数据类:

往往对话框中会有很多的组件,如果没一个组件都需要一个变量来保存它的值,这样就会有很多变量.这样,对话框类就需要提供一个变量一对Setter/Getter方法.类的方法数量会暴涨,从而对Dialog类尝试了严重的污染.流行的MVC模式就是 要把界面和数据尽可能的剥离开来,因此应该把对话框的数据封装到一个数据类中.

关于JFace的自定义对话框(Dialog类)

Human.java

 public class Human {
private String name; // 姓名
private int old;// 年龄
private boolean sex;// 性别 public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getOld() {
return old;
} public void setOld(int old) {
this.old = old;
} public boolean isSex() {
return sex;
} public void setSex(boolean sex) {
this.sex = sex;
} }

接下来参照TableViewer的setInput和getInput为自定义对话框类提供两个方法给Human数据类输入输出,并写好取出数据类给界面做初始化,及将界面值更新到数据类的代码,其代码如下所示:'

MyDialog3.java

 public class MyDialog3 extends Dialog {
private Human human;
private Text nameText;
private Text oldText;
private Button ggButton, mmButton; public MyDialog3(Shell parentShell) {
super(parentShell);
} public Human getInput() {
return this.human;
} public void setInput(Human human) {
this.human = human;
} // 在这个方法里构建Dialog中的界面内容
protected Control createDialogArea(Composite parent) {
Composite topComp = new Composite(parent, SWT.NONE);
topComp.setLayout(new GridLayout(2, false));
new Label(topComp, SWT.NONE).setText("姓名:");
nameText = new Text(topComp, SWT.BORDER);
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
new Label(topComp, SWT.NONE).setText("年龄:");
oldText = new Text(topComp, SWT.BORDER);//省略了只能输入数值的限制
oldText.setLayoutData(new GridData(20,-1)); new Label(topComp, SWT.NONE).setText("性别:");
Composite c = new Composite(topComp, SWT.None);
c.setLayout(new RowLayout());
ggButton = new Button(c, SWT.RADIO);
ggButton.setText("男");
mmButton = new Button(c, SWT.RADIO);
mmButton.setText("女"); if (human != null) {
nameText.setText(human.getName() == null ? "" : human.getName());
oldText.setText(String.valueOf(human.getOld()));
ggButton.setSelection(human.isSex());
mmButton.setSelection(!human.isSex());
}
return topComp;
} protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {// 如果单击确定按钮,则将值保存到Human对象中
if (human == null)
human = new Human();
human.setName(nameText.getText());
human.setOld(Integer.parseInt(oldText.getText()));
human.setSex(ggButton.getSelection());
}
super.buttonPressed(buttonId);
}
}

使用这种自定义对话框类的客户端的代码如下:

MyDialog3Client.java

 public class MyDialog3 extends Dialog {
private Human human;
private Text nameText;
private Text oldText;
private Button ggButton, mmButton; public MyDialog3(Shell parentShell) {
super(parentShell);
} public Human getInput() {
return this.human;
} public void setInput(Human human) {
this.human = human;
} // 在这个方法里构建Dialog中的界面内容
protected Control createDialogArea(Composite parent) {
Composite topComp = new Composite(parent, SWT.NONE);
topComp.setLayout(new GridLayout(2, false));
new Label(topComp, SWT.NONE).setText("姓名:");
nameText = new Text(topComp, SWT.BORDER);
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
new Label(topComp, SWT.NONE).setText("年龄:");
oldText = new Text(topComp, SWT.BORDER);//省略了只能输入数值的限制
oldText.setLayoutData(new GridData(20,-1)); new Label(topComp, SWT.NONE).setText("性别:");
Composite c = new Composite(topComp, SWT.None);
c.setLayout(new RowLayout());
ggButton = new Button(c, SWT.RADIO);
ggButton.setText("男");
mmButton = new Button(c, SWT.RADIO);
mmButton.setText("女"); if (human != null) {
nameText.setText(human.getName() == null ? "" : human.getName());
oldText.setText(String.valueOf(human.getOld()));
ggButton.setSelection(human.isSex());
mmButton.setSelection(!human.isSex());
}
return topComp;
} protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {// 如果单击确定按钮,则将值保存到Human对象中
if (human == null)
human = new Human();
human.setName(nameText.getText());
human.setOld(Integer.parseInt(oldText.getText()));
human.setSex(ggButton.getSelection());
}
super.buttonPressed(buttonId);
}
}

运行结果:

关于JFace的自定义对话框(Dialog类)

点击OK

关于JFace的自定义对话框(Dialog类)

如果是女最后Console最后一行是false.

保存对话框的值(IDialogSettings类)

有时候会有这样的状态,记下对话框的状态,当用户再次打开的时候再还原状态,这就需要把对话框的值保存下来,一般是保存到一个文本文件中.Dialog的IDialogSettings类提供了这样的功能,不过用起来比较繁琐,IDialogSetting类本身并不复杂,它仅是提供了对文件操作和设值操作的封装,它生成的文件是一个XML文件.如下所示:

关于JFace的自定义对话框(Dialog类)

保存对话框值的实现代码如下,与MyDialog3相同的代码都省略了,运行示例的客户端是MyDialog4Client.java

MyDialog4.java

 import java.io.IOException;

 import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.DialogSettings;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text; public class MyDialog4 extends Dialog {
private Human human;
private Text nameText;
private Text oldText;
private Button ggButton, mmButton; public MyDialog4(Shell parentShell) {
super(parentShell);
} public Human getInput() {
return this.human;
} public void setInput(Human human) {
this.human = human;
} // 在这个方法里构建Dialog中的界面内容
protected Control createDialogArea(Composite parent) {
Composite topComp = new Composite(parent, SWT.NONE);
topComp.setLayout(new GridLayout(2, false));
new Label(topComp, SWT.NONE).setText("姓名:");
nameText = new Text(topComp, SWT.BORDER);
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
new Label(topComp, SWT.NONE).setText("年龄:");
oldText = new Text(topComp, SWT.BORDER);// 省略了只能输入数值的限制
oldText.setLayoutData(new GridData(20, -1)); new Label(topComp, SWT.NONE).setText("性别:");
Composite c = new Composite(topComp, SWT.None);
c.setLayout(new RowLayout());
ggButton = new Button(c, SWT.RADIO);
ggButton.setText("男");
mmButton = new Button(c, SWT.RADIO);
mmButton.setText("女"); // 如果没有手动设置初始值,则取出以前保存在文件里的值更新到Human对象
if (human == null)
restoreState(); if (human != null) {
nameText.setText(human.getName() == null ? "" : human.getName());
oldText.setText(String.valueOf(human.getOld()));
ggButton.setSelection(human.isSex());
mmButton.setSelection(!human.isSex());
}
return topComp;
} protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {// 如果单击确定按钮,则将值保存到Human对象中
if (human == null)
human = new Human();
human.setName(nameText.getText());
human.setOld(Integer.parseInt(oldText.getText()));
human.setSex(ggButton.getSelection());
saveState();//将Human对象保存到文件
}
super.buttonPressed(buttonId);
} // 将Human对象保存到文件
public void saveState() {
if (human == null)
return;
IDialogSettings topSettings = getTopSettings();
IDialogSettings settings = topSettings.getSection("MyDialog4");
if (settings == null)
settings = topSettings.addNewSection("MyDialog4");
settings.put("name", human.getName());
settings.put("old", human.getOld());
settings.put("sex", human.isSex());
try {
topSettings.save("icons/system.xml");
} catch (IOException e) {
e.printStackTrace();
}
} // 取出保存的值并更新到Human对象
public void restoreState() {
IDialogSettings topSettings = getTopSettings();
IDialogSettings settings = topSettings.getSection("MyDialog4");
if (settings == null)
return;
if (human == null)
human = new Human();
human.setName(settings.get("name"));
human.setOld(settings.getInt("old"));
human.setSex(settings.getBoolean("sex"));
} // 取得*的IDialogSettings
public IDialogSettings getTopSettings() {
IDialogSettings topSettings = new DialogSettings("system");
try {
topSettings.load("icons/system.xml");
} catch (IOException e) {
System.out.println(e.getMessage());
}
return topSettings;
}
}

MyDialog4Client.java

 import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell; public class MyDialog4Client {
public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(327, 253);
// ---------创建窗口中的其他界面组件-------------
// 生成一个Human对象
Human human = new Human();
human.setName("陈刚");
human.setOld(80);
human.setSex(true); MyDialog4 dialog = new MyDialog4(shell);
// dialog.setInput(human);
if (dialog.open() == IDialogConstants.OK_ID) {// 是否单击“确定”按钮
Human o = dialog.getInput(); // 取值
if (o == human)
System.out.println("是同一个对象");
System.out.println(o.getName());
System.out.println(o.getOld());
System.out.println(o.isSex());
}
// -----------------END------------------------
shell.dispose();
display.dispose();
}
}

运行结果如下:

刚运行如下图:(一开始没有生成system.xml文件,对话框中的内容页是空的)

关于JFace的自定义对话框(Dialog类)

然后输相应的值点击确定值之后在控制台上的输出,并且在对应的路径下生成了对应的system.xml文件:

关于JFace的自定义对话框(Dialog类)

第二次再次启动这个文件的时候(对话框中保留上次的输入的值和system.xml文件中对应的内容信息.):

关于JFace的自定义对话框(Dialog类)

带提示栏的对话框(TitileAreaDialog类)

TitileAreaDialog是Dialog的子类,它在原Dialog界面的顶部加了一条信息提示栏.扩展TitleAreaDialog和扩展Dialog的方法一样,使用方法也相同,示例代码如下:

MyTitleAreaDialog.java

import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text; public class MyTitleAreaDialog extends TitleAreaDialog { public MyTitleAreaDialog(Shell parentShell) {
super(parentShell);
} protected Control createDialogArea(Composite parent) {
setTitle("对话框标题");
setMessage("请在文本框中输入文字");
setMessage("对话框的说明文字", IMessageProvider.INFORMATION);
// setErrorMessage("输入错误");
Composite topComp = new Composite(parent, SWT.BORDER);
topComp.setLayoutData(new GridData(GridData.FILL_BOTH));
topComp.setLayout(new RowLayout());
new Label(topComp, SWT.NONE).setText("请输入:");
Text text = new Text(topComp, SWT.BORDER);
text.setLayoutData(new RowData(100, -1));
return topComp;
}
}
MyTitleAreaDialogClient.java
 import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell; public class MyTitleAreaDialogClient {
public static void main(String[] args) {
Display display = Display.getDefault();
Shell shell = new Shell(display); new MyTitleAreaDialog(shell).open(); display.dispose();
}
}

对应的输出结果:

关于JFace的自定义对话框(Dialog类)

运行结果如上图.代码中对topComp设置了一个GridData.如果不设置,得到的效果图

关于JFace的自定义对话框(Dialog类)

不设置的GridData的话,面板龟缩在对话框的一角,从这一句也可以知道,createDialogArea方法传入的容器用的是GridLayout布局.

设置信息栏,除了setMessage方法,还有setErrorMessage方法,后者在信息前多加了一个小红叉图标,另外,setMessage方法还可以加式样,如下示例是在信息前加一个警告图标.

setMessage("对话框的说明文字",IMessageProvider.WARNING):

共4种式样:

·IMessageProvider.INFORMATION:信息图标.

·IMessageProvider.WARNING:警告图标.

·IMessageProvider.ERROR:错误图标,和setErrorMessage(String str)效果相同.

·IMessageProvider.NONE:什么都没有,和setMessage(String str)效果相同.