15.7 自定义对话框
在界面的开发中,并不是所有的对话框都会符合用户的要求,用户经常要自己定义对话框。要定义自己的对话框,可以通过继承Dialog实现,也可以通过Dialog的子类实现,本节将继承JFace的TitleAreaDialog实现自定义对话框。
15.7.1 带标题区域对话框
带标题区域对话框(TitleAreaDialog)继承于JFace的Dialog类,TitleAreaDialog实现了几个比较常用的方法。
l createContents:重写了Dialog的createContents方法,把对话框区域分成标题区域和对话框区域。
l createTitleArea:建立标题区域的组件。
l createDialogArea:建立对话框区域的组件。
l setTitle:设置显示的标题。
l setMessage:设置显示的信息。
l setErrorMessage:设置显示的错误信息。
15.7.2 自定义对话框实例
本节实例中将重写TitleAreaDialog的createDialogArea方法和重写Dialog的createButtons- ForButtonBar方法,创建对话框区域和创建对话框按钮,并且添加对话框的校验方法validate,代码如例程15-9所示。
例程15-9 CreateOwnDialogExample.java
public class CreateOwnDialogExample {
public static void main(String[] args) {
Display display = new Display();
final Shell shell = new Shell(display);
shell.setSize(400,100);
shell.setLayout(new FillLayout());
Button b1 = new Button(shell, SWT.PUSH);
b1.setText("Open mail Dialog ...");
b1.pack();
b1.setLocation(50, 50);
b1.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent se) {
MailDialog dial= new MailDialog(shell, new String[]{"mail", "gan"});
dial.open();
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
class MailDialog extends TitleAreaDialog {
public static final int OPEN = 9999;
public static final int DELETE = 9998;
List list;
String[] items;
String[] itemsToOpen;
public MailDialog(Shell shell, String[] items) {
super(shell);
this.items = items;
}
public void create() {
super.create();
setTitle("Mail");
setMessage("You have mail! \n It could be vital for this evening...");
}
//重写createDialogArea方法,创建对话框区域
protected Control createDialogArea(Composite parent) {
//添加对话框区域的父面板
final Composite area = new Composite(parent, SWT.NULL);
final GridLayout gridLayout = new GridLayout();
gridLayout.marginWidth = 15;
gridLayout.marginHeight = 10;
//设置父面板的布局方式
area.setLayout(gridLayout);
//在对话框区域中添加List组件
list = new List(area, SWT.BORDER | SWT.MULTI);
final GridData gridData = new GridData();
gridData.widthHint = 200;
list.setLayoutData(gridData);
list.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
validate();
}
});
for (int i = 0; i < items.length; i++) {
list.add(items[i]);
}
return area;
}
//添加自定义对话框的校验方法
private void validate() {
boolean selected = (list.getSelectionCount() > 0);
getButton(OPEN).setEnabled(selected);
getButton(DELETE).setEnabled(selected);
if (!selected)
setErrorMessage("Select at least one entry!");
else
setErrorMessage(null);
}
//重写Dialog的createButtonsForButtonBar方法创建对话框按钮
protected void createButtonsForButtonBar(Composite parent) {
//添加“Open”按钮
Button openButton = createButton(parent, OPEN, "Open", true);
// 初始状态为禁用
openButton.setEnabled(false);
//为“Open”按钮添加事件
openButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
itemsToOpen = list.getSelection();
setReturnCode(OPEN);
close();
}
});
//添加“Delete”按钮
Button deleteButton = createButton(parent, DELETE, "Delete", false);
deleteButton.setEnabled(false);
//为“Delete”按钮添加事件
deleteButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
int selectedItems[] = list.getSelectionIndices();
list.remove(selectedItems);
//校验当前数据
validate();
}
});
Button cancelButton = createButton(parent, CANCEL, "Cancel", false);
//添加“Cancel”按钮
cancelButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
setReturnCode(CANCEL);
close();
}
});
}
public String[] getItemsToOpen() {
return itemsToOpen;
}
}
上例添加了一个自定义对话框,并在测试程序中新建了自定义对话框,程序运行效果如图15-7所示。

图15-7 自定义对话框
一般来说,用户可以通过继承JFace现有的对话框进行扩展,在现有对话框的基础上可以非常容易地定义自己的对话框。






