65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.88/5 (5投票s)

2001 年 11 月 18 日

5分钟阅读

viewsIcon

66422

downloadIcon

1554

一个抽象基类,提供了选项对话框所需的基本基础结构。更具体地说,它管理三个选项按钮(确定、应用和取消)的创建、布局、显示和事件处理。

Sample Image - JOptionsDialog.gif

Sample Image - JOptionsDialog.gif1

引言

一个典型的选项对话框可以看作是简单地由两个窗格组成;一个 主体窗格,您可以在其中显示特定于应用程序的用户界面组件,以及一个更通用的 选项窗格,用户可以在其中选择保存/放弃所做的更改并关闭对话框。(请参阅上面的屏幕截图)

此外,大多数选项对话框都具有 脏行为脏行为 定义了两种状态;未脏。当处于 未脏 状态时(例如,当对话框首次初始化或单击 应用 按钮时),应用 按钮将处于禁用状态,单击 确定 按钮将直接关闭对话框。当处于 状态时(例如,当用户编辑文本字段或选择复选框时),应用 按钮将处于启用状态,单击 确定 按钮将在关闭对话框之前更新对话框的数据模型。

JOptionsDialog 是一个简单的抽象类,它负责让这种对话框正常工作所需的所有基本工作。更具体地说,它管理选项窗格的创建、布局、显示和事件处理,以及对话框的状态(脏行为)。此外,用户可以选择显示三个可用按钮的任意组合,和/或更改按钮的对齐方式和尺寸。所提供的功能大部分可以在编译时或运行时进行配置。如果某个功能无法配置,您肯定可以在子类中对其进行自定义。

此类以及示例对话框的详细 API 文档,都包含在演示和源代码 zip 包中。特别是,示例对话框的源代码可以成为构建您自己的专用对话框的有用骨架。

用法

要创建您自己的选项对话框,通常需要做三件事。

  1. 将您的类扩展自 JOptionsDialog
  2. 在抽象方法 initBodyPane() 中实现主体窗格的用户界面组件的初始化;
  3. 最后,在抽象方法 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 组件(如 JTextFieldJComboBox 等)用于接收用户输入,然后将其传输到数据模型。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 来居中对话框。

许可证

本文档没有明确的许可证,但可能包含文章文本或下载文件本身的使用条款。如有疑问,请通过下方的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.