创建带有确定/取消/应用按钮的对话框的抽象类。






3.88/5 (5投票s)
2001 年 11 月 18 日
5分钟阅读

66422

1554
一个抽象基类,提供了选项对话框所需的基本基础结构。更具体地说,它管理三个选项按钮(确定、应用和取消)的创建、布局、显示和事件处理。
引言
一个典型的选项对话框可以看作是简单地由两个窗格组成;一个 主体窗格,您可以在其中显示特定于应用程序的用户界面组件,以及一个更通用的 选项窗格,用户可以在其中选择保存/放弃所做的更改并关闭对话框。(请参阅上面的屏幕截图)
此外,大多数选项对话框都具有 脏行为。脏行为 定义了两种状态;脏 和 未脏。当处于 未脏 状态时(例如,当对话框首次初始化或单击 应用 按钮时),应用 按钮将处于禁用状态,单击 确定 按钮将直接关闭对话框。当处于 脏 状态时(例如,当用户编辑文本字段或选择复选框时),应用 按钮将处于启用状态,单击 确定 按钮将在关闭对话框之前更新对话框的数据模型。
JOptionsDialog
是一个简单的抽象类,它负责让这种对话框正常工作所需的所有基本工作。更具体地说,它管理选项窗格的创建、布局、显示和事件处理,以及对话框的状态(脏行为)。此外,用户可以选择显示三个可用按钮的任意组合,和/或更改按钮的对齐方式和尺寸。所提供的功能大部分可以在编译时或运行时进行配置。如果某个功能无法配置,您肯定可以在子类中对其进行自定义。
此类以及示例对话框的详细 API 文档,都包含在演示和源代码 zip 包中。特别是,示例对话框的源代码可以成为构建您自己的专用对话框的有用骨架。
用法
要创建您自己的选项对话框,通常需要做三件事。
- 将您的类扩展自
JOptionsDialog
; - 在抽象方法
initBodyPane()
中实现主体窗格的用户界面组件的初始化; - 最后,在抽象方法
updateData(boolean)
中实现主体窗格的用户界面组件与数据模型之间的数据传输机制。
实现主体窗格
如上所述,子类应在抽象方法 initBodyPane()
中实现主体窗格用户界面组件的所有初始化。此方法不接受任何参数,并返回一个 java.awt.Container
对象。实现应包括主体窗格用户界面组件的创建、布局和事件处理设置。下面显示了示例对话框实现中的代码片段
/**
* Initializes the body pane. creates,
* layout and set up the event handling
* functions for the body pane's UI components.
* @return a container that holds all
* the dialog body components.
*/
protected Container initBodyPane() {
//create button panel
JPanel jpButtons = new JPanel();
jpButtons.setLayout(new GridLayout(3,1));
... //other stuff
m_jcbShowOK = new JCheckBox("Show OK");
m_jcbShowOK.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
setDirty();
}
}
);
jpButtons.add(m_jcbShowOK);
... //other stuff
JPanel jpBody = new JPanel();
jpBody.add(jpButtons, BorderLayout.WEST);
... //other stuff
return jpBody;
}
在上面的代码中,请注意在类属性 m_jcbShowOK
的动作监听器中调用了 setDirty()
方法(JOptionsDialog
中实现的受保护方法)。当用户单击“显示确定”复选框时,这将把对话框状态设置为 脏。子类负责在适当的时候调用 setDirty()
将对话框状态设置为 脏。否则,对话框将始终保持 未脏 状态,用户输入的数据将永远不会传输到对话框的数据模型。这里的例外情况是当对话框样式设置为 BEHAVE_DIRTY_ALWAYS
时(请参阅后面关于配置对话框的部分),这会导致对话框永久处于 脏 状态。
实现数据模型与 UI 组件之间的数据交换
在典型的选项对话框中,UI 组件(如 JTextField
、JComboBox
等)用于接收用户输入,然后将其传输到数据模型。JOptionsDialog
通过抽象方法 updateData(boolean)
促进了此机制。此方法接受一个 boolean
参数,该参数确定数据流的方向(即,如果为 true
,则数据应从 UI 组件传输到数据模型。反之亦然),并且不返回任何内容。下面显示了示例对话框实现中的代码片段
/**
* Updates the data model. To make things simple,
* our model is simply a Properties
* object. If toModel is true, we will write the data from the UI
* components to the Properties object.
* And vice versa. At the same time, we will
* also update the dialog style.
* @param toModel a flag which determines
* the direction of the data flow. If
* true, then the update should be
* FROM UI components TO the data model.
*/
public void updateData(boolean toModel) {
int flags = 0;
if (toModel) //data transfer from Control to Model
{
//lets clear our model
m_prop.clear();
if (m_jcbShowOK.isSelected()) {
flags |= OPTION_OK;
m_prop.setProperty("OPTION_OK", "set");
}
... //other stuff
} else { //from Model to Control
if (m_prop.getProperty("OPTION_OK")!= null) {
flags |= OPTION_OK;
m_jcbShowOK.setSelected(true);
}
... //other stuff
}
... //other stuff
}
配置 JOptionsDialog
JOptionsDialog
可以通过使用样式标志轻松配置。有关可用样式及其描述的列表,请参阅 javadoc。要配置对话框的样式,只需对所需的样式进行按位 OR 操作,然后将结果传递给 setDialogProperties()
方法。要配置选项按钮的尺寸,请使用 setButtonDimension()
方法。这两个方法的完整签名如下所示
public void setDialogProperties(int flags, boolean shouldPack) {
... //other stuff
}
public void setButtonDimension(Dimension dim, boolean shouldPack) {
... //other stuff
}
参数 shouldPack
指示方法在设置新样式后是否应调用 Window.pack()
。当您需要多次配置对话框(例如,同时设置按钮尺寸)然后显示它时,将 false
传递会稍微更有效率。在大多数情况下,您会想传递 true
来立即显示更新的样式。为此提供了两个方便的方法。
public void setDialogProperties(int flags) {
setDialogProperties(flags, true);
}
public void setButtonDimension(Dimension dim) {
setButtonDimension(dim, true);
}
JOptionsDialog 便利函数
public int doModal(){
... //other stuff
}
VC++ 开发者可能会觉得这个最熟悉。是的,这个想法绝对是“借鉴”了 Microsoft Foundation Class 库。基本上,这是一个方便的方法,可以以模态循环显示您的选项对话框,当对话框关闭时,返回用户单击的选项按钮的 ID。
public void centerDialog(){
... //other stuff
}
这是一个辅助函数,用于相对于其所有者居中对话框。如果它没有所有者,或者所有者不可见,则对话框相对于全屏居中。您可能想使用样式标志 DISPLAY_CENTER_DIALOG
来居中对话框。
许可证
本文档没有明确的许可证,但可能包含文章文本或下载文件本身的使用条款。如有疑问,请通过下方的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。