如何制作对话框

对话框窗口是一个独立的子窗口,除了主 Swing 应用程序窗口外,它还用于携带临时通知。大多数对话框都会向用户显示错误消息或警告,但是对话框可以显示图像,目录树或几乎任何与 管理 它们的主 Swing 应用程序兼容的东西。

为了方便起见,几个 Swing 组件类可以直接实例化并显示* dialogs *。要创建简单的标准对话框,请使用JOptionPane类。 ProgressMonitor类可以构建一个对话框,以显示操作进度。 JColorChooserJFileChooser两个其他类也提供标准对话框。要调出打印对话框,可以使用Printing API。要创建自定义对话框,请直接使用JDialog类。

简单对话框的代码可能最少。例如,这是一个信息对话框:

信息对话框所需的代码最少

这是创建并显示它的代码:

JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.");

本节的其余部分包括以下主题:

对话框概述

每个对话框都依赖于框架组件。当该框架被销毁时,其相关对话框也将被销毁。当框架被图标化时,其相关对话框也将从屏幕上消失。当框架去图标化后,其从属对话框将返回屏幕。 Swing JDialog 类从 AWT Dialog类继承此行为。

对话框可以是* modal *。当出现 Pattern 对话框时,它将阻止用户 Importing 程序中的所有其他窗口。 JOptionPane 创建 Pattern 的JDialog。要创建非 Pattern 对话框,必须直接使用JDialog类。

从 JDK 7 开始,您可以使用新的 Modality API 修改对话框窗口的模态行为。有关详情,请参见新 PatternAPI

JDialog类是 AWT java.awt.Dialog类的子类。它向Dialog对象添加了root pane容器并支持默认的关闭操作。这些与JFrame具有相同的功能,直接使用JDialog与使用JFrame非常相似。如果要直接使用JDialog,那么您应该了解使用顶层容器如何制作框架的内容,尤其是响应窗口关闭事件

即使使用JOptionPane实现对话框,您仍在幕后使用JDialog。原因是JOptionPane只是一个容器,可以自动创建JDialog并将其自身添加到JDialog的内容窗格中。

DialogDemo 示例

这是显示对话框的应用程序的图片。

DialogDemo 可让您打开多种对话框

Try this::

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行对话框演示。另外,要自己编译和运行示例,请查阅example index

  • 单击显示!按钮。
    将会出现一个 Pattern 对话框。在关闭它之前,该应用程序将无响应,尽管会在必要时重新绘制自身。您可以通过单击对话框中的按钮或显式关闭对话框,例如使用对话框窗口装饰。

  • 在“更多对话框”窗格中,单击底部的单选按钮,然后单击“显示它”!按钮。
    将出现一个非 Pattern 对话框。请注意,非 Pattern 对话框打开时,DialogDemo 窗口仍可正常使用。

  • 在显示非 Pattern 对话框时,将 DialogDemo 窗口图标化。
    对话框将从屏幕上消失,直到您取消对 DialogDemo 窗口的定义。

JOptionPane Features

使用JOptionPane,您可以快速创建和自定义几种不同类型的对话框。 JOptionPane支持布局标准对话框,提供图标,指定对话框标题和文本以及自定义按钮文本。其他功能使您可以自定义对话框显示的组件,并指定对话框应在屏幕上显示的位置。您甚至可以指定选项窗格将其自身置于internal frame(JInternalFrame)而不是JDialog

当您创建JOptionPane时,外观特定的代码会将组件添加到JOptionPane并确定这些组件的布局。

JOptionPane的图标支持使您可以轻松指定对话框显示的图标。您可以使用自定义图标,完全不使用图标或使用四个标准JOptionPane图标(问题,信息,警告和错误)中的任何一个。每种外观都有其自己的四个标准图标版本。下图显示了 Java(和 Windows)外观中使用的图标。

*** JOptionPane 使用的图标** *

Icon descriptionJava 外观Windows 外观
question提出问题的对话框的 Java 外观图标询问问题的对话框的 Windows 外观图标
information信息对话框的 Java 外观图标Windows 外观图标,用于信息对话框
warning用于警告对话框的 Java 外观图标Windows 外观图标,用于警告对话框
error错误对话框的 Java 外观图标错误对话框的 Windows 外观图标

创建和显示简单对话框

对于大多数简单的模态对话框,可以使用JOptionPaneshowXxxDialog方法之一创建并显示该对话框。如果对话框应为internal frame,则在show之后添加Internal,例如showMessageDialog更改为showInternalMessageDialog。如果需要控制对话框的关闭窗口行为,或者不想让对话框成为 Pattern 对话框,则应直接实例化JOptionPane并将其添加到JDialog实例。然后在JDialog上调用setVisible(true)使其显示。

两种最有用的showXxxDialog方法是showMessageDialogshowOptionDialogshowMessageDialog方法显示一个简单的一键式对话框。 showOptionDialog方法显示自定义对话框-它可以显示带有自定义按钮文本的各种按钮,并且可以包含标准文本消息或组件集合。

其他两种showXxxDialog方法使用较少。 showConfirmDialog方法要求用户确认某些内容,但会显示标准按钮文本(例如“是/否”或本地化的等效内容),而不是根据用户情况定制的按钮文本(例如“开始/取消”)。第四种方法showInputDialog旨在显示 Pattern 对话框,该对话框使用文本字段,不可编辑的组合框或列表从用户那里获取字符串。

以下是一些使用showMessageDialogshowOptionDialogJOptionPane构造函数的示例,取自DialogDemo.java。有关更多示例代码,请参见DialogDemo.java使用对话框的示例中列出的其他程序。

  • showMessageDialog

    • 显示一个带有一个按钮的 Pattern 对话框,该对话框标记为“确定”(或本地化的等效项)。您可以轻松指定对话框显示的消息,图标和标题。以下是一些使用showMessageDialog的示例:
带有默认标题和图标的信息对话框//默认标题和图标

JOptionPane.showMessageDialog(frame,
“鸡蛋不应该是绿色的。”);
带有自定义标题,警告图标的信息对话框//自定义标题,警告图标
JOptionPane.showMessageDialog(frame,
“鸡蛋不应该是绿色的。”,
"Inane warning",
JOptionPane.WARNING_MESSAGE);
带有自定义标题,错误图标的信息对话框//自定义标题,错误图标
JOptionPane.showMessageDialog(frame,
“鸡蛋不应该是绿色的。”,
"Inane error",
JOptionPane.ERROR_MESSAGE);
带有自定义标题的信息对话框,无图标//自定义标题,无图标
JOptionPane.showMessageDialog(frame,
“鸡蛋不应该是绿色的。”,
“一个简单的消息”,
JOptionPane.PLAIN_MESSAGE);
带有自定义标题,自定义图标的信息对话框//自定义标题,自定义图标
JOptionPane.showMessageDialog(frame,
“鸡蛋不应该是绿色的。”,
“ Inane 自定义对话框”,
JOptionPane.INFORMATION_MESSAGE,
icon);
  • showOptionDialog

显示带有指定按钮,图标,消息,标题等的 Pattern 对话框。使用此方法,您可以更改标准对话框按钮上显示的文本。您还可以执行许多其他类型的自定义。

是/否/取消(用不同的词表示); showOptionDialog
//自定义按钮 Literals


Object [140] options = {“是,请”,
"No, thanks",
“没有鸡蛋,没有火腿!”};
int n = JOptionPane.showOptionDialog(frame,
“你想要一些绿色的鸡蛋吗?”
+ “和那个火腿?”,

“一个愚蠢的问题”,

JOptionPane.YES_NO_CANCEL_OPTION,

JOptionPane.QUESTION_MESSAGE,

null,

options,

options[2]);|

  • JOptionPane(构造函数)

  • 用指定的按钮,图标,消息,标题等创建一个JOptionPane。然后,您必须将选项窗格添加到JDialog,在选项窗格上注册属性更改侦听器,然后显示对话框。有关详情,请参见停止自动关闭对话框

明确使用 JOptionPane 构造函数
最后的 JOptionPane optionPane =新的 JOptionPane(


“关闭此对话框的唯一方法是\ n”
+ “按下以下按钮之一。\ n”

+ “你理解吗?”,

JOptionPane.QUESTION_MESSAGE,

JOptionPane.YES_NO_OPTION);|

所有showXxxDialog方法和JOptionPane构造函数的参数都是标准化的,尽管每种方法和构造函数的参数数量有所不同。以下列表描述了每个参数。要查看特定方法的确切参数列表,请参见对话框 API

  • Component parentComponent

    • 每个showXxxDialog方法的第一个参数始终是父组件,它必须是 Frame,Frame 内部的组件或为 null。如果指定框架或对话框,则对话框将出现在框架中心上方,并遵循该框架的聚焦行为。如果在框架内指定组件,则对话框将出现在该组件的中心上方,并将遵循该组件框架的聚焦行为。如果指定 null,则外观将为对话框选择一个合适的位置-通常是屏幕的中心,并且 Dialog 不一定会遵循任何可见 Frame 或 Dialog 的焦点行为。

JOptionPane构造函数不包含此参数。而是在创建包含JOptionPaneJDialog时指定父框架,并使用JDialog setLocationRelativeTo方法设置对话框的位置。

  • Object message

    • 此必选参数指定对话框应在其主区域中显示什么。通常,您指定一个字符串,这将导致对话框显示带有指定文本的标签。您可以通过在消息字符串 中放置换行符(\n)将消息分成几行。例如:
"Complete the sentence:\n \"Green eggs and...\""
  • String title

    • 对话框的标题。
  • int optionType

    • 指定显示在对话框底部的按钮集。从以下标准集之一中进行选择:DEFAULT_OPTIONYES_NO_OPTIONYES_NO_CANCEL_OPTIONOK_CANCEL_OPTION
  • int messageType

    • 此参数确定对话框中显示的图标。从以下值之一中选择:PLAIN_MESSAGE(无图标),ERROR_MESSAGEINFORMATION_MESSAGEWARNING_MESSAGEQUESTION_MESSAGE
  • Icon icon

    • 在对话框中显示的图标。
  • Object[] options

    • 通常用于指定对话框底部每个按钮显示的字符串。有关更多信息,请参见在标准对话框中自定义按钮文本。也可以用于指定要由按钮显示的图标或要添加到按钮行的非按钮组件。
  • Object initialValue

    • 指定要选择的默认值。

您可以让选项窗格显示其默认图标,也可以使用消息类型或图标参数指定图标。默认情况下,使用showMessageDialog创建的选项窗格显示信息图标,使用showConfirmDialogshowInputDialog创建的选项窗格显示问题图标,使用JOptionPane构造函数创建的选项窗格不显示图标。要指定对话框显示标准图标还是不显示图标,请指定与所需图标相对应的消息类型。要指定自定义图标,请使用 icon 参数。 icon 参数优先于消息类型;只要 icon 参数具有非 null 值,对话框就会显示指定的图标。

自定义按钮 Literals

当您使用JOptionPane创建对话框时,可以使用标准按钮文本(可能因外观和区域而异)或指定其他文本。默认情况下,选项窗格类型决定出现多少按钮。例如,YES_NO_OPTION对话框具有两个按钮,而YES_NO_CANCEL_OPTION对话框具有三个按钮。

以下代码取自DialogDemo.java,创建了两个是/否对话框。第一个对话框是使用showConfirmDialog实现的,它使用了两个按钮的外观措辞。第二个对话框使用showOptionDialog,因此可以自定义措辞。除了更改措辞外,对话框是相同的。

是/否对话框,用这些词表示(但可能会翻译)//默认图标,自定义标题

int n = JOptionPane.showConfirmDialog(
frame,
“您要绿色鸡蛋和火腿吗?”,
“一个无知的问题”,
JOptionPane.YES_NO_OPTION);
是/否对话框-换句话说对象[196]选项= {“是,请”,
"No way!"};
int n = JOptionPane.showOptionDialog(frame,
“您要绿色鸡蛋和火腿吗?”,
“一个愚蠢的问题”,
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,//不使用自定义图标
选项,//按钮的标题
选项[197]); //默认按钮标题

如先前的代码片段所示,showMessageDialogshowConfirmDialogshowOptionDialog方法返回一个整数,指示用户的选择。该整数的值为YES_OPTIONNO_OPTIONCANCEL_OPTIONOK_OPTIONCLOSED_OPTION。除CLOSED_OPTION外,每个选项均对应于用户按下的按钮。返回CLOSED_OPTION时,表示用户显式关闭了对话框窗口,而不是通过选择选项窗格内的按钮来关闭。

即使更改标准对话框按钮显示的字符串,返回值仍然是 预定义的整数之一。例如,YES_NO_OPTION对话框始终返回以下值之一:YES_OPTIONNO_OPTIONCLOSED_OPTION

从对话框获取用户 Importing

唯一不返回整数的showXxxDialog形式是showInputDialog,它返回ObjectObject通常是String,反映了用户的选择。这是使用showInputDialog创建对话框的示例,该对话框使用户可以选择以下三个字符串 之一:

带组合框的 Importing 对话框

Object[] possibilities = {"ham", "spam", "yam"};
String s = (String)JOptionPane.showInputDialog(
                    frame,
                    "Complete the sentence:\n"
                    + "\"Green eggs and...\"",
                    "Customized Dialog",
                    JOptionPane.PLAIN_MESSAGE,
                    icon,
                    possibilities,
                    "ham");

//If a string was returned, say so.
if ((s != null) && (s.length() > 0)) {
    setLabel("Green eggs and... " + s + "!");
    return;
}

//If you're here, the return value was null/empty.
setLabel("Come on, finish the sentence!");

如果您不想限制用户的选择,则可以使用采用较少参数的showInputDialog方法形式,也可以为对象数组指定null。在 Java 外观中,用null替换possibilities会导致一个对话框,该对话框具有文本字段,如下所示:

具有文本字段的 Importing 对话框

因为用户可以在文本字段中键入任何内容,所以您可能要检查返回的值,并要求用户再次try它是否无效。另一种方法是创建一个自定义对话框,该对话框在返回用户 Importing 的数据之前先对其进行验证。有关验证数据的示例,请参见CustomDialog.java

如果要设计自定义对话框,则需要设计对话框的 API,以便可以向对话框查询用户的选择。例如,CustomDialog具有getValidatedText方法,该方法返回用户 Importing 的文本。

停止自动关闭对话框

默认情况下,当用户单击JOptionPane创建的按钮时,对话框关闭。但是,如果要在关闭对话框之前检查用户的答案怎么办?在这种情况下,您必须实现自己的属性更改侦听器,以便在用户单击按钮时对话框不会自动关闭。

DialogDemo包含两个实现属性更改侦听器的对话框。这些对话框之一是在CustomDialog中实现的自定义 Pattern 对话框,该对话框使用JOptionPane既获取标准图标又获得布局帮助。另一个对话框(其代码如下)使用标准的 Yes/No JOptionPane。尽管此对话框在编写时没有多大用处,但其代码非常简单,您可以将其用作更复杂对话框的模板。

除了设置属性更改侦听器之外,下面的代码还调用JDialogsetDefaultCloseOperation方法,并实现一个可以正确处理关闭窗口try的窗口侦听器。如果您不希望在用户显式关闭窗口时收到通知,请忽略粗体代码。

final JOptionPane optionPane = new JOptionPane(
                "The only way to close this dialog is by\n"
                + "pressing one of the following buttons.\n"
                + "Do you understand?",
                JOptionPane.QUESTION_MESSAGE,
                JOptionPane.YES_NO_OPTION);

final JDialog dialog = new JDialog(frame, 
                             "Click a button",
                             true);
dialog.setContentPane(optionPane);
dialog.setDefaultCloseOperation(
    JDialog.DO_NOTHING_ON_CLOSE);
dialog.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent we) {
        setLabel("Thwarted user attempt to close window.");
    }
});
optionPane.addPropertyChangeListener(
    new PropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent e) {
            String prop = e.getPropertyName();

            if (dialog.isVisible() 
             && (e.getSource() == optionPane)
             && (prop.equals(JOptionPane.VALUE_PROPERTY))) {
                //If you were going to check something
                //before closing the window, you'd do
                //it here.
                dialog.setVisible(false);
            }
        }
    });
dialog.pack();
dialog.setVisible(true);

int value = ((Integer)optionPane.getValue()).intValue();
if (value == JOptionPane.YES_OPTION) {
    setLabel("Good.");
} else if (value == JOptionPane.NO_OPTION) {
    setLabel("Try using the window decorations "
             + "to close the non-auto-closing dialog. "
             + "You can't!");
}

对话框 API

下表列出了常用的JOptionPaneJDialog构造函数和方法。您可能会调用的其他方法由DialogWindowComponent类定义,包括packsetSizesetVisible

该 API 列出如下:

显示标准模态对话框(使用 JOptionPane 类方法)

MethodPurpose
静态 void showMessageDialog(Component,Object)

静态 void showMessageDialog(Component,Object,String,int)
静态 void showMessageDialog(Component,Object,String,int,Icon)
显示一键式模态对话框,向用户提供一些信息。参数(按 Sequences)指定对话框的父组件,消息,标题,消息类型和图标。有关参数及其作用的讨论,请参见创建和显示简单对话框
静态 int showOptionDialog(组件,对象,字符串,int,int,图标,Object [],Object)显示定制的模态对话框。参数(按 Sequences)指定对话框的父组件,消息,标题,选项类型,消息类型,图标,选项和初始值。有关参数及其作用的讨论,请参见创建和显示简单对话框
静态 int showConfirmDialog(Component,Object)
静态 int showConfirmDialog(Component,Object,String,int)
静态 int showConfirmDialog(Component,Object,String,int,int)
静态 int showConfirmDialog(Component,Object,String,int,int,Icon)
显示一个模态对话框,询问用户一个问题。参数(按 Sequences)指定对话框的父组件,消息,标题,选项类型,消息类型和图标。有关参数及其作用的讨论,请参见创建和显示简单对话框
静态字符串showInputDialog(Object)
静态字符串showInputDialog(Component,Object)
静态字符串showInputDialog(Component,Object,String,int)
静态字符串showInputDialog(Component,Object,String,int,Icon,Object [],Object)
显示一个 Pattern 对话框,提示用户 Importing。单参数版本仅指定消息,并且父组件假定为 null。其他版本的参数(按 Sequences)指定对话框的父组件,消息,标题,消息类型,图标,选项和初始值。有关参数及其作用的讨论,请参见创建和显示简单对话框
静态无效的 showInternalMessageDialog(...)
静态 void showInternalOptionDialog(...)
静态 void showInternalConfirmDialog(...)
静态字符串showInternalInputDialog(...)
实现标准对话框作为内部框架。有关参数的确切列表,请参见JOptionPane API 文档

直接使用 JOptionPanes 的方法

方法或构造函数Purpose
JOptionPane()

JOptionPane(Object)
JOptionPane(Object, int)
JOptionPane(Object,int,int)
JOptionPane(Object,int,int,Icon)
JOptionPane(Object,int,int,Icon,Object [])
JOptionPane(Object,int,int,Icon,Object [],Object)
创建JOptionPane实例。有关参数及其作用的讨论,请参见创建和显示简单对话框
静态框架 getFrameForComponent(Component)
静态 JDesktopPane getDesktopPaneForComponent(Component)
方便的JOptionPane类方法,分别找到指定组件所在的framedesktop pane
int getMaxCharactersPerLineCount()确定将在选项窗格文本中自动插入换行符的位置。 (默认值为Integer.MAX_VALUE.)要使用此方法,必须创建JOptionPane子类。例如,以下代码导致选项窗格中每行只有一个单词,这是因为字符串 中的每个单词等于或少于 5 个字符:
JOptionPane op = new JOptionPane(“这是文本.”){
public int getMaxCharactersPerLineCount(){
return 5;
}
};

常用的 JDialog 构造函数和方法

方法或构造函数Purpose
JDialog()

JDialog(Dialog)
JDialog(Dialog, boolean)
JDialog(Dialog, String)
JDialog(对话框,字符串,布尔值)
JDialog(对话框,字符串,布尔值,GraphicsConfiguration)
JDialog(Frame)
JDialog(Frame, boolean)
JDialog(Frame, String)
JDialog(Frame,String,boolean)
JDialog(Frame,String,boolean,GraphicsConfiguration)
JDialog(Window owner)
JDialog(窗口所有者,Dialog.ModalityType modalityType)
JDialog(窗口所有者,字符串 标题)
JDialog(窗口所有者,字符串 标题,Dialog.ModalityType modalityType)
JDialog(窗口所有者,字符串 标题,Dialog.ModalityType modalityType,GraphicsConfiguration gc)
创建JDialog实例。 Frame参数(如果有)是对话框依赖的框架(通常是JFrame对象)。使 Boolean 参数true指定一个 Pattern 对话框,false或不指定一个非 Pattern 对话框。您还可以使用字符串 参数指定对话框的标题。
void setContentPane(Container)
Container getContentPane()
获取并设置内容窗格,该窗格通常是所有对话框组件的容器。有关更多信息,请参见使用顶层容器
void setDefaultCloseOperation(int)
int getDefaultCloseOperation()
获取并设置用户try关闭对话框时发生的情况。可能的值:DISPOSE_ON_CLOSEDO_NOTHING_ON_CLOSEHIDE_ON_CLOSE(默认值)。有关更多信息,请参见响应窗口关闭事件
void setLocationRelativeTo(Component)将对话框置于指定组件的中心。
静态 void setDefaultLookAndFeelDecorated(boolean)
静态布尔值 isDefaultLookAndFeelDecorated()
设置或获取有关对话框的窗口装饰(例如边框或关闭窗口的小部件)是否应由当前外观提供的提示。否则,对话框的装饰将由当前的窗口 管理 器提供。有关更多信息,请参见指定窗户装饰

使用对话框的示例

下表列出了使用JOptionPaneJDialog的示例。要查找使用对话框的其他示例,请参见progress barscolor choosersfile choosers的示例列表。

ExampleWhere DescribedNotes
DialogDemo,

CustomDialog
此部分使用JOptionPaneJDialog创建多种对话框。
Framework当用户选择“退出”菜单项时,弹出确认对话框。
ListDialog如何使用 BoxLayout将执行包含滚动列表和两个按钮的 Pattern 对话框。除了 Util 方法getFrameForComponent之外,不使用JOptionPane