SWT自定义对话框总结

合集下载

自定义文档类型选择对话框

自定义文档类型选择对话框

自定义"文档类型选择"对话框mfc的mdi多文档结构有2层含义: 一是可以同时打开多个文档, 这些文档是同一个类型(同一个document template). 这也是appwizard向导生成的默认情况, 在CWinApp::InitInstance()函数中, 只注册了一个document template.二是可以同时打开多个不同document template类型的文档. 需要在InitInstance()中自行添加需要的文档模板类型; 此后, 如果有2个或2个以上的文档类型, 则在利用mdi默认的"新建文件"时, 将会弹出一个简单的"文档类型选择"对话框, 让用户选择要新建的文档类型. 而在"打开文件"操作时, 则在"打开"对话框的文件类型下拉列表中, 会看到所注册的多个文档类型.我们经常需要变更的就是这个默认的"新建文件"操作, 毕竟那个mfc默认的"文档类型选择"对话框无论是从外观上还是功能上都很难满足我们的需要.默认"文档类型选择"对话框的定义为:class CNewTypeDlg : public CDialog可以在VC6.0安装目录的vc98\mfc\src\docmgr.cpp文件中找到. 下面将会仿照这个对话框来设计自定义的"文档类型选择"对话框, 并可以添加自己需要的各种功能.首先观察mfc"新建文件"操作的过程源码. 对于ID_FILE_NEW消息, 利用VC6.0 IDE的搜索功能,找到: \VC98\MFC\SRC\APPDLG.CPP(25):voidCWinApp::OnFileNew()如下:void CWinApp::OnFileNew(){if (m_pDocManager != NULL)m_pDocManager->OnFileNew();}m_pDocManager是CWinApp的成员. 类型为CDocManager*然后继续找到: \VC98\MFC\SRC\DOCMGR.CPP(802):voidCDocManager::OnFileNew()如下:void CDocManager::OnFileNew(){if (m_templateList.IsEmpty()){TRACE0("Error: no document templates registered with CWinApp.\n"); AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);return;}CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();if (m_templateList.GetCount() > 1){// more than one document template to choose from// bring up dialog prompting userCNewTypeDlg dlg(&m_templateList);int nID = dlg.DoModal();if (nID == IDOK)pTemplate = dlg.m_pSelectedTemplate;elsereturn; // none - cancel operation}ASSERT(pTemplate != NULL);ASSERT_KINDOF(CDocTemplate, pTemplate);pTemplate->OpenDocumentFile(NULL);// if returns NULL, the user has already been alerted}在这个函数中, 就可以发现CNewTypeDlg的踪迹.工程的名字假定为My, 则我们有CMyApp派生类.我们所需要做的工作是:1, 在菜单中添加一个新的菜单项例如ID_FILE_NEW_1, 并添加消息响应函数例如OnFileNew1(); 或者直接为原来的ID_FILE_NEW添加消息响应函数OnFileNew. 这里采用后一种.2, 添加CMyApp::OnFileNew()后, 不要忘记删除My.cpp中MESSAGE_MAP里的这一项:ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)3, 在CMyApp::OnFileNew()中, 把上面的CWinApp::OnFileNew()和CDocManager::OnFileNew()的代码拷贝过去, 并加以改造如下:void CMyApp::OnFileNew(){// from CWinApp::OnFileNew():if (m_pDocManager == NULL){return;}// from CDocManager::OnFileNew():// 由于无法访问CDocManager的保护数据成员m_templateList// 故要使用CDocManager::GetFirstDocTemplatePosition()// 和CDocManager::GetNextDocTemplate()接口来获得所有文档模板类指针// 并将其添加到自定义的列表m_DocTplList中POSITION pos = m_pDocManager->GetFirstDocTemplatePosition();if (pos == NULL){TRACE0("Error: no document templates registered with CWinApp.\n"); AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);return;}// 遍历获得各个文档模板类指针// 注意, 在CMyApp的定义中添加成员CPtrList m_DocTplList用以放置这些指针CDocTemplate* pTemplate = NULL;while (pos != NULL){pTemplate = m_pDocManager->GetNextDocTemplate(pos);ASSERT(pTemplate != NULL);this->m_DocTplList.AddTail(pTemplate);}// 如果文档类型超过1个则使用自定义的"文档类型选择"对话框CDlgChooseClass// 在资源编辑器中添加一个对话框, 并创建对话框类CDlgChooseClass// 在对话框中放置一个ListBox控件, 用来容纳多个文档类型// 稍后有具体说明if (m_DocTplList.GetCount() > 1){CDlgChooseClass dlg(&m_DocTplList); // 输入文档模板类指针的列表 int nID = dlg.DoModal(); // 对话框CDlgChooseClass完成选择文档类型 // 并且可以有其他自定义的操作if (nID == IDOK){pTemplate = dlg.m_pSelectedTemplate;}else{m_DocTplList.RemoveAll(); // 注意: 清空自定义的列表return; // none - cancel operation}}m_DocTplList.RemoveAll(); // 注意: 清空自定义的列表// 检查返回的值ASSERT(pTemplate != NULL);ASSERT_KINDOF(CDocTemplate, pTemplate);// 选定的文档模板类: 创建新文档pTemplate->OpenDocumentFile(NULL);// if returns NULL, the user has already been alerted}接下来是设计CDlgChooseClass, 仿照CNewTypeDlg的定义进行(vc98\mfc\src\docmgr.cpp).class CDlgChooseClass : public CDialog{// Constructionpublic:// 修改默认构造函数, 增加一个参数CPtrList* pListCDlgChooseClass(CPtrList* pList, CWnd* pParent = NULL);// Dialog Datapublic:CDocTemplate* m_pSelectedTemplate; // 选定的文档模板类//{{AFX_DATA(CDlgChooseClass)enum { IDD = IDD_DLG_CHOOSE_CLASS };// NOTE: the ClassWizard will add data members here//}}AFX_DATA// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CDlgChooseClass)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:CPtrList* m_pList; // 文档模板类指针列表// Generated message map functions//{{AFX_MSG(CDlgChooseClass)virtual BOOL OnInitDialog();virtual void OnOK();//}}AFX_MSGDECLARE_MESSAGE_MAP()};实现OnInitDialog()和OnOk()如下:基本上是拷贝CNewTypeDlg::OnInitDialog()和CNewTypeDlg::OnOk()的代码, 并略做修改BOOL CDlgChooseClass::OnInitDialog(){// IDC_DOC_TPL_LIST是ListBox的IDCListBox* pListBox = (CListBox*)GetDlgItem(IDC_DOC_TPL_LIST); ASSERT(pListBox != NULL);// fill with document templates in listpListBox->ResetContent();POSITION pos = m_pList->GetHeadPosition();// add all the CDocTemplates in the list by namewhile (pos != NULL){CDocTemplate* pTemplate = (CDocTemplate*)m_pList->GetNext(pos);ASSERT_KINDOF(CDocTemplate, pTemplate);// 这里是添加fileNewName来代表各个文档模板. 也可以设计其他的显示方式CString strTypeName;if (pTemplate->GetDocString(strTypeName, CDocTemplate::fileNewName) &&!strTypeName.IsEmpty()){// add it to the listboxint nIndex = pListBox->AddString(strTypeName);if (nIndex == -1){EndDialog(-1);return FALSE;}pListBox->SetItemDataPtr(nIndex, pTemplate);}}int nTemplates = pListBox->GetCount();if (nTemplates == 0){TRACE0("Error: no document templates to select from!\n");EndDialog(-1); // abort}else if (nTemplates == 1){// get the first/only itemm_pSelectedTemplate = (CDocTemplate*)pListBox->GetItemDataPtr(0); ASSERT_VALID(m_pSelectedTemplate);ASSERT_KINDOF(CDocTemplate, m_pSelectedTemplate);EndDialog(IDOK); // done}else{// set selection to the first one (NOT SORTED)pListBox->SetCurSel(0);}return CDialog::OnInitDialog();}void CDlgChooseClass::OnOK(){// TODO: Add extra validation hereCListBox* pListBox = (CListBox*)GetDlgItem(IDC_DOC_TPL_LIST); ASSERT(pListBox != NULL);// if listbox has selection, set the selected templateint nIndex;if ((nIndex = pListBox->GetCurSel()) == -1){// no selectionm_pSelectedTemplate = NULL;}else{m_pSelectedTemplate =(CDocTemplate*)pListBox->GetItemDataPtr(nIndex);ASSERT_VALID(m_pSelectedTemplate);ASSERT_KINDOF(CDocTemplate, m_pSelectedTemplate);}CDialog::OnOK();}当然, 构造函数也要注意修改:CDlgChooseClass::CDlgChooseClass(CPtrList* pList, CWnd* pParent /* = NULL */): CDialog(CDlgChooseClass::IDD, pParent){//{{AFX_DATA_INIT(CDlgChooseClass)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INITm_pList = pList; // 文档模板类指针列表m_pSelectedTemplate = NULL; // 最后选择的文档模板类}到这里就完成了. 进入程序, 选择"文件"-"新建", 或者直接Ctrl+N, 出来的已经是我们自定义的CDlgChooseClass对话框了, 且基本功能和原来默认的完全一样(选择文档类型). 要增加新的功能, 或者改善外观? 这就是对话框设计的问题了.。

swt中各种对话框

swt中各种对话框
}
六、文件选择对话框:同上
1,实现方法
FileDialog dialog = new FileDialog(shell,SWT.OPEN);
dialog.setFilterPath("c:\windows");//设置初始路径
String fileName = dialog.open();//返回的全路径(路径+需要自己实现,它只提供界面,并得到用户选择的目录和输入的文件名
FileDialog dialog = new FileDialog(shell,SWT.SAVE);
String fileName = dialog.open();
}else{
return "错误:请输入大于0,小于100的数";
}
}
}
然后改写定义语句为
InputDialog inputDialog = new InputDialog(shell,"标题","提示信息","默认值",new MyValidator());
}catch(NumberFormatException e){
return "错误:请输入数值";
}
if(value>0 && value<100){
return null;
三、颜色选择对话框
不多说,使用方法几乎在swt中遍地都是的用法。
ColorDialog dialog = new ColorDialog(shell);
RGB rgb = dialog.open();
if(rgb != null){

《Visual Basic语言程序设计基础(第3版)》第10章 对话框

《Visual Basic语言程序设计基础(第3版)》第10章 对话框

10.4 通用对话框(CommonDialog)控件(四)
用通用对话框控件生成各种对话框(三)
“另存为”对话框:通过ShowSave方法可以显示“另存为”对话 框
【例10.8】将以下代码放入某一对象的Click事件中,将显示“另存 为”对话框,然后在“文件名”信息框中显示选定的文件的名字。
Dim OF As String
'定义用于存放文件名的变量
CommonDialog1.Flags= &H10&Or&H4&
'设置对话框含有"帮助(H) "按钮,并且隐去"以只读方式打开"复选框
CommonDialog1.Filter="所有文件(*.*)|*.*|文本文件(*.txt)|*.txt|
批处理文件(*.bat)|*.bat" '设置过滤器
10.4 通用对话框(CommonDialog)控件(八)
用通用对话框控件生成各种对话框(七)
“字体”对话框
常用属性(二)
FontUnderline、FontStrikethru属性:确定是否选择下划线、删除线
【例10.11】将以下代码放入某一对象的Click事件中,将显示“字体”对话

CommonDialog1.Flags=cdlCFEffectsOrcdlCFBoth
对话框,并在“文件名”信息框中显示所选的文件名。
Dim SF As String
'定义用于存放文件名的变量
CommonDialog1.Flags=&H10&Or&H4&
‘设置Flags属性,使对话框含有“帮助(H) ”按钮并隐去"以只读方式打开"复选框

对话框及常用控件

对话框及常用控件

统一的视觉风格
对话框的视觉风格应与应 用程序的整体风格保持一 致。
合适的色彩搭配
对话框的颜色搭配应符合 应用程序的主题和风格, 同时也要考虑色彩的对比 度和舒适度。
精美的图标和插图
对话框中可以适当地使用 图标和插图,以提高视觉 效果和用户体验。
一致性
对话框布局一致
不同对话框的布局和组件应保持一致,以提高用户对 应用程序的熟悉度和使用效率。
提示对话框
总结词
提供简短信息或警告的对话框
详细描述
提示对话框通常用于向用户显示应用程序的状态或提 供简短的通知。它包含一个标题、一条消息和一个关 闭按钮。根据需要,提示对话框还可以包含图标以强 调其重要性。
感谢观看
THANKS
按钮
总结词
用于触发特定功能的控件
详细描述
按钮是常见的交互控件,用户点击按钮后可以触发特定的功能或操作。根据功 能,按钮可分为确认、取消、提交等类型。
列表框
总结词
用于显示和选择列表项的控件
详细描述
列表框可以显示一系列的列表项,用户可以通过鼠标或键盘选择所需的列表项。根据选择方式,列表 框可分为单选列表框和多选列表框。
对话框的分类
模态对话框
模态对话框会阻塞用户对其他界面的 操作,直到对话框关闭。这类对话框 常用于需要用户做出决策或输入的情 况。
非模态对话框
非模态对话框不会阻塞用户对其他界 面的操作,用户可以在对话框打开的 同时进行其他操作。这类对话框常用 于显示信息或提供简单的选项。
对话框的使用场景
确认操作
01
复选框
总结词
用于表示选项是否被选中的控件
详细描述
复选框是一种开关控件,用户可以通过点击来选中或取消选中某个选项。多个复选框可 以组合在一起,表示多个选项的组合。Fra bibliotek单选按钮

SWT编程笔记

SWT编程笔记

SWT(Standard Widget Toolkit)是采用JNI技术写成的一套java GUI库。

Eclipse的图形用户界面就基于此库开发。

JNI(Java Native Interface)已经是java体系中的一员。

其作用是能够让jvm调用本机代码,从而提高程序某些部分的执行效率。

由于SWT是通过JNI技术调用操作系统的底层GUI组件进行工作的,因此相比于AWT或者SWING等纯虚拟机图形框架来说,SWT的速度要快一些。

SWT的稳定性比SWING要好。

基本知识:基本元素说明:Display:表示了计算机屏幕。

Shell: 它表示位于"屏幕"上面的"窗口",Shell本身在SWT类结构图中处于比较底层的位置,但是Composite组件和Control组件构成的组件树的根(逻辑上)。

Composite:可以包含其它Composite和Control的容器。

Control:这是一个重量级(Heavy Weight)系统对象。

像按钮(Button),标签(Label),表格,工具栏和树形结构这些组件都是Control的子类,Composite和Shell也不例外。

资源的释放1. 如果你创建了某个资源,那么你就有责任释放它。

2. 释放父组件资源的同时也释放了其子组件的资源。

标准构造函数窗口组件被创建的时候必须伴随一个他的上层组件,例如,要建立一个按钮就可以采用如下方法:Button button = new Button(shell, SWT.PUSH);其中,Button的父组件Shell是必不可少的,这样就限定了我们生成组件的顺序。

第二个参数被称为"Style Bit",表示了这个组件的显示特性,每种特性占一位,如下例所示:Text test=new Text(group, SWT.SINGLE|SWT.BORDER);设置组件的布局我们可以采用Composite.setLayout()方法来实现。

自己定制网页对话框

自己定制网页对话框

自己定制网页对话框当程序进程在服务端继续运行之前,谁没有使用过window.confirm()方法显示一个确认对话框给用户呢?而我在初次使用它的时候就确信我爱上了它。

可是,有两件另人讨厌的事促使我来创建自己定制的对话框:1.按纽的焦点问题 confirm()方法选择默认的按纽是“OK”。

假设你有一个grid控件和分布在控件中每行的按纽。

当用户点击此按纽激发删除行事件时,你喜欢显示一个确认对话框。

在进行那样的操作中显示对话框是一个很好的习惯。

然而,如果用户由于失误敲了回车键,那么“OK”按纽单击事件就被执行了。

2.默认的“OK”和“Cancel”两个按纽不能修改(样式、文件的修改之类的)。

下面说一下使用自定制对话框的几点好处:1.需要将默认项设置给“OK”按纽之外的按纽。

2.需要改变默认按纽的文本(如我喜欢用"Yes"和"No")、修改按纽的样式。

我应该提醒的最后一件事就是一旦窗口大小改变,对话框要具有重置自己位置的能力。

这样的话将始终会显示在窗口中央。

程序步骤[ 返回页首 ]让我们来检验一下这个创建自定制对话框的程序。

HTML代码这个对话框由以下几个控件组成。

1.三个div层2.两个Web服务器控件(按纽)代码清单1<div id="divConfMessage" runat="server" style="BORDER-RIGHT:black thin solid; BORDER-TOP:black thin solid; DISPLAY:none; Z-INDEX:200; BORDER-LEFT:black thin solid; BORDER-BOTTOM:black thin solid"><div style="BACKGROUND-COLOR: #6699cc;TEXT-ALIGN: center" id="confirmText"></div><div style="Z-INDEX: 105;HEIGHT: 2%;BACKGROUND-COLOR: white;TEXT-ALIGN: center"></div><div style="Z-INDEX: 105;BACKGROUND-COLOR: white;TEXT-ALIGN: center"><asp:Button ID="btnConfOK" Runat="server" Text="OK"></asp:Button><asp:Button ID="btnConfCancel" Runat="server" Text="Cancel"></asp:Button></div></div>以上清单将创建一个为我们的对话框服务的层。

第11章 对话框和向导

第11章  对话框和向导

在SWT中,实现对话框的部件是Dialog。不过Dialog 是一个抽象类,也就是说,它是不能直接使用的,只能通过 继承来实现。下面先来看一个最简单的对话框。在实际开发 中,完全从简单的Dialog来实都提供了大量定制好的对话框,多数 情况都是直接使用这些定制好的对话框。学习使用Dialog, 目的也是为了了解对话框实现的基本原理。
11.1.9
文件夹对话框
文件对话框只能选择文件,要选择文件夹就要使用 DirectoryDialog,文件夹对话框。DirectoryDialog的使用 更简单。DirectoryDialog不需要设置样式,也就是说只有 唯一一种样式。如下面的例子,open()返回后,就可以获得 选择的文件夹(包括完整的路径)。 private void openDialog(){ DirectoryDialog dialog = new DirectoryDialog(getShell()); String path = dialog.open(); if(path!=null){ directory.setText(path); } }
11.2
JFace的对话框
JFace中,与对话框相关的类都位于 org.eclipse.jface.dialogs内。JFace的对话框都不是继承 自SWT的Dialog。JFace自己另外定义了一个Dialog类,所 以JFace的对话框不是对SWT的增强,完全是另外一种全新 样式的对话框。
11.2.1
要实现向导,大概可以分成下面几个步骤进行: 第一步:实现每一个向导分页。向导分页都继承自抽 象类WizardPage。 第二步:实现向导对象,向导对象类继承自抽象类 Wizard。在Wizard中添加前面第一步做好的向导分页。 第三步:把已经实现的向导对象添加到WizardDialog 中。

VBA与自定义对话框开发

VBA与自定义对话框开发

VBA与自定义对话框开发VBA(Visual Basic for Applications)是一种宏语言,集成在许多Microsoft Office应用程序中,如Excel、Word和PowerPoint。

它允许用户编写自定义代码来增强这些应用程序的功能。

其中一个常见的用途是通过自定义对话框来与用户进行交互。

自定义对话框是一个可视化工具,可以用于收集和显示用户输入的数据。

通过使用VBA,我们可以创建专门定制的对话框,使用户能够更轻松地与我们的应用程序进行交互。

为什么选择VBA开发自定义对话框?VBA是一种易于学习和使用的语言,无需专业编程背景即可开始开发。

它提供了许多工具和函数,使我们能够快速创建自定义对话框。

此外,VBA集成在Microsoft Office中,因此可以轻松访问和使用Office应用程序的功能和特性。

下面将介绍VBA中的几种方法来创建自定义对话框。

1. 使用UserFormUserForm是一个空白窗体,可以向其添加各种控件(如文本框、按钮和组合框)来与用户进行交互。

我们可以使用VBA编辑器中的画面设计器,轻松地设计和布局UserForm。

首先,我们需要在VBA编辑器中打开一个模块。

然后,通过选择“插入”->“用户窗体”来创建一个新的UserForm。

然后,我们可以在UserForm上添加所需的控件,并编写VBA代码来实现所需的功能。

例如,我们可以创建一个简单的登录对话框,其中包含用户名和密码文本框,并添加一个登录按钮。

在按钮的点击事件中,我们可以通过比较输入的用户名和密码与预先定义的值来验证用户身份。

2. 使用InputBox函数InputBox函数是VBA中的内置函数,可用于创建简单的输入对话框。

它接受一个消息参数和一个可选的标题参数,并返回用户输入的字符串。

例如,我们可以使用InputBox函数来创建一个对话框,提示用户输入一个数字,然后在Excel中进行计算。

```Sub CalculateSum()Dim inputNumber As StringDim sum As IntegerinputNumber = InputBox("请输入一个数字:", "求和") sum = 0If IsNumeric(inputNumber) Thensum = inputNumber + 10MsgBox "结果为:" & sumElseMsgBox "无效的输入!"End IfEnd Sub```这个示例向用户显示一个对话框,要求输入一个数字。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自定义对话框
在rcp开发中,要自定义对话框,首先要继承org.eclipse.jface.dialogs.Dialog public class MyDialog extends Dialog
1、定义对话框标题,需要重写configureShell方法。

@Override
protected void configureShell(Shell newShell) {
// TODO Auto-generated method stub
super.configureShell(newShell);
newShell.setText("Hello");
}
2、定义对话框大小,需要重写getInitialSize方法。

@Override
protected Point getInitialSize() {
return new Point(540,480);
}
3、定义对话框界面,需要重写createDialogArea方法。

以下是org.eclipse.jface. dialogs.Dialog的createDialogArea方法的源码,我们可以根据需要在里面添加自己需要的组件
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent,SWT.NONE);
GridLayout layout = new GridLayout();
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(new GridData(GridData.FILL_BOTH)); applyDialogFont(composite);
//Group group = new Group(composite,SWT.NONE);
//……添加自己的组件
return composite;
}
4、自定义对话框按钮。

需要重写createButton和initializeBounds两个方法。

org.eclipse.jface.dialogs.Dialog根据按钮的ID来管理按钮,这个类有两个默认的按钮,OK和CANCEL,ID分别为IDialogConstants.OK_ID,IDialogConstants.CANCEL_ID.我们重载createButton方法,使其失效:
@Override
protected Button createButton(Composite parent,int id,String label,boolean
defaultButton) {
return null;
}
这样就不会创建那两个默认的不受我们控制的按钮.然后重载initializeBounds方法,我们在这个方法里面创建我们自己的按钮:
public static final int APPLY_ID = 2;
@Override
protected void initializeBounds() {
//我们可以利用原有的ID创建按钮,也可以用自定义的ID创建按钮
//但是调用的都是父类的createButton方法.
super.createButton((Composite)getButtonBar(),IDialogConstants.OK_ID,"确定",false);
super.createButton((Composite)getButtonBar(),IDialogConstants.CANCEL_ID,"取消",false);
super.createButton((Composite)getButtonBar(),APPLY_ID,"应用",false);
//下面这个方法一定要加上,并且要放在创建按钮之后,否则就不会创建按钮super.initializeBounds();
}
5、其实,org.eclipse.jface.dialogs.Dialog类中专门有一个Map,叫buttons,用于存放我们在initializeBounds方法中创建的按钮,我们可以通过getButton(int id)方法来取到按钮,对其进行操作,比如:
Button btn = getButton(APPLY_ID);
btn.setEnabled(false);//让按钮失效
btn.removeSelectionListener(this);//移除按钮的监听事件
6、调用super.createButton方法的时候,该方法会自动给已创建的按钮添加选中事件的监听器SelectionListener。

我们无法利用该监听器来做事情,但是幸好Dialog给我们提供了一个方法,buttonPressed(int buttonId),从字面上我们就能理解这个方法的作用,我们重载它:
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
//做我们想做的事情
}
//事后要记得调用父类的buttonPressed方法
super.buttonPressed(buttonId);
}
7、如果我们想从对话框的组件中取值,那是不能直接取到的。

如果我们的Dialog 中有一个Text组件叫text(要作为类的域对象),要取它的值,需要一个变量(假设为String value)来存储,把这个value作为类的域对象,给它添加get和set 方法,然后在buttonPressed方法中这样做:
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
//如果按了OK按钮,就把text的值放入value对象中
setValue(text.getText());
}
super.buttonPressed(buttonId);
}
我们打开该对话框的代码如下:
MyDialog md = new MyDialog(this.getShell);
md.setValue(“初值”);// 在open之前,把值放入value中
If(md.open() == IDialogConstants.OK_ID){
//如果按了OK按钮,就取出value的值(其实就是text的值)
String str = md.getValue();
}
我们无法直接取到text的值,是因为按了initializeBounds创建的按钮之后,对话框会退出,里面的组件会被销毁,我们再取,就会出错。

8、给对话框组件设置值。

同样,我们不能直接设置值。

因为在open方法之前,组件还没有创建。

我们可以在open之前,把值放入value中,在createDialogArea方法里面,创建text的时候,把value放到text中
protected Control createDialogArea(Composite parent) {
//…………………
text = new Text(composite,SWT.NONE);
text.setText(value == null ? "":value);// setText不接受null值
}
9、修改对话框样式,需要重写getShellStyle方法。

protected int getShellStyle(){
return super.getShellStyle()|SWT.RESIZE|SWT.MAX;
}
备注:在swing中调用swt对话框时,注意要采用异步的方式运行,否则会造成swing线程的死锁,界面刷新不正确。

调用方式如下:
display.asyncExec(new Runnable() {
public void run() {
}
});。

相关文档
最新文档