如何制作对话框
对话框窗口是一个独立的子窗口,除了主 Swing 应用程序窗口外,它还用于携带临时通知。大多数对话框都会向用户显示错误消息或警告,但是对话框可以显示图像,目录树或几乎任何与 管理 它们的主 Swing 应用程序兼容的东西。
为了方便起见,几个 Swing 组件类可以直接实例化并显示* dialogs *。要创建简单的标准对话框,请使用JOptionPane类。 ProgressMonitor类可以构建一个对话框,以显示操作进度。 JColorChooser和JFileChooser两个其他类也提供标准对话框。要调出打印对话框,可以使用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 示例
这是显示对话框的应用程序的图片。
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 description | Java 外观 | Windows 外观 |
---|---|---|
question | ||
information | ||
warning | ||
error |
创建和显示简单对话框
对于大多数简单的模态对话框,可以使用JOptionPane
的showXxxDialog
方法之一创建并显示该对话框。如果对话框应为internal frame,则在show
之后添加Internal
,例如showMessageDialog
更改为showInternalMessageDialog
。如果需要控制对话框的关闭窗口行为,或者不想让对话框成为 Pattern 对话框,则应直接实例化JOptionPane
并将其添加到JDialog
实例。然后在JDialog
上调用setVisible(true)
使其显示。
两种最有用的showXxxDialog
方法是showMessageDialog
和showOptionDialog
。 showMessageDialog
方法显示一个简单的一键式对话框。 showOptionDialog
方法显示自定义对话框-它可以显示带有自定义按钮文本的各种按钮,并且可以包含标准文本消息或组件集合。
其他两种showXxxDialog
方法使用较少。 showConfirmDialog
方法要求用户确认某些内容,但会显示标准按钮文本(例如“是/否”或本地化的等效内容),而不是根据用户情况定制的按钮文本(例如“开始/取消”)。第四种方法showInputDialog
旨在显示 Pattern 对话框,该对话框使用文本字段,不可编辑的组合框或列表从用户那里获取字符串。
以下是一些使用showMessageDialog
,showOptionDialog
和JOptionPane
构造函数的示例,取自DialogDemo.java。有关更多示例代码,请参见DialogDemo.java和使用对话框的示例中列出的其他程序。
-
showMessageDialog
- 显示一个带有一个按钮的 Pattern 对话框,该对话框标记为“确定”(或本地化的等效项)。您可以轻松指定对话框显示的消息,图标和标题。以下是一些使用
showMessageDialog
的示例:
- 显示一个带有一个按钮的 Pattern 对话框,该对话框标记为“确定”(或本地化的等效项)。您可以轻松指定对话框显示的消息,图标和标题。以下是一些使用
//默认标题和图标 | |
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 对话框。使用此方法,您可以更改标准对话框按钮上显示的文本。您还可以执行许多其他类型的自定义。
//自定义按钮 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 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
构造函数不包含此参数。而是在创建包含JOptionPane
的JDialog
时指定父框架,并使用JDialog
setLocationRelativeTo
方法设置对话框的位置。
-
Object message
- 此必选参数指定对话框应在其主区域中显示什么。通常,您指定一个字符串,这将导致对话框显示带有指定文本的标签。您可以通过在消息字符串 中放置换行符(
\n
)将消息分成几行。例如:
- 此必选参数指定对话框应在其主区域中显示什么。通常,您指定一个字符串,这将导致对话框显示带有指定文本的标签。您可以通过在消息字符串 中放置换行符(
"Complete the sentence:\n \"Green eggs and...\""
-
String title
- 对话框的标题。
-
int optionType
- 指定显示在对话框底部的按钮集。从以下标准集之一中进行选择:
DEFAULT_OPTION
,YES_NO_OPTION
,YES_NO_CANCEL_OPTION
,OK_CANCEL_OPTION
。
- 指定显示在对话框底部的按钮集。从以下标准集之一中进行选择:
-
int messageType
- 此参数确定对话框中显示的图标。从以下值之一中选择:
PLAIN_MESSAGE
(无图标),ERROR_MESSAGE
,INFORMATION_MESSAGE
,WARNING_MESSAGE
,QUESTION_MESSAGE
。
- 此参数确定对话框中显示的图标。从以下值之一中选择:
-
Icon icon
- 在对话框中显示的图标。
-
Object[] options
- 通常用于指定对话框底部每个按钮显示的字符串。有关更多信息,请参见在标准对话框中自定义按钮文本。也可以用于指定要由按钮显示的图标或要添加到按钮行的非按钮组件。
-
Object initialValue
- 指定要选择的默认值。
您可以让选项窗格显示其默认图标,也可以使用消息类型或图标参数指定图标。默认情况下,使用showMessageDialog
创建的选项窗格显示信息图标,使用showConfirmDialog
或showInputDialog
创建的选项窗格显示问题图标,使用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]); //默认按钮标题 |
如先前的代码片段所示,showMessageDialog
,showConfirmDialog
和showOptionDialog
方法返回一个整数,指示用户的选择。该整数的值为YES_OPTION
,NO_OPTION
,CANCEL_OPTION
,OK_OPTION
和CLOSED_OPTION
。除CLOSED_OPTION
外,每个选项均对应于用户按下的按钮。返回CLOSED_OPTION
时,表示用户显式关闭了对话框窗口,而不是通过选择选项窗格内的按钮来关闭。
即使更改标准对话框按钮显示的字符串,返回值仍然是 预定义的整数之一。例如,YES_NO_OPTION
对话框始终返回以下值之一:YES_OPTION
,NO_OPTION
或CLOSED_OPTION
。
从对话框获取用户 Importing
唯一不返回整数的showXxxDialog
形式是showInputDialog
,它返回Object
。 Object
通常是String
,反映了用户的选择。这是使用showInputDialog
创建对话框的示例,该对话框使用户可以选择以下三个字符串 之一:
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
会导致一个对话框,该对话框具有文本字段,如下所示:
因为用户可以在文本字段中键入任何内容,所以您可能要检查返回的值,并要求用户再次try它是否无效。另一种方法是创建一个自定义对话框,该对话框在返回用户 Importing 的数据之前先对其进行验证。有关验证数据的示例,请参见CustomDialog.java。
如果要设计自定义对话框,则需要设计对话框的 API,以便可以向对话框查询用户的选择。例如,CustomDialog
具有getValidatedText
方法,该方法返回用户 Importing 的文本。
停止自动关闭对话框
默认情况下,当用户单击JOptionPane
创建的按钮时,对话框关闭。但是,如果要在关闭对话框之前检查用户的答案怎么办?在这种情况下,您必须实现自己的属性更改侦听器,以便在用户单击按钮时对话框不会自动关闭。
DialogDemo
包含两个实现属性更改侦听器的对话框。这些对话框之一是在CustomDialog中实现的自定义 Pattern 对话框,该对话框使用JOptionPane
既获取标准图标又获得布局帮助。另一个对话框(其代码如下)使用标准的 Yes/No JOptionPane
。尽管此对话框在编写时没有多大用处,但其代码非常简单,您可以将其用作更复杂对话框的模板。
除了设置属性更改侦听器之外,下面的代码还调用JDialog
的setDefaultCloseOperation
方法,并实现一个可以正确处理关闭窗口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
下表列出了常用的JOptionPane
和JDialog
构造函数和方法。您可能会调用的其他方法由Dialog,Window和Component类定义,包括pack
,setSize
和setVisible
。
该 API 列出如下:
方法或构造函数 | 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 类方法,分别找到指定组件所在的frame或desktop pane。 |
int getMaxCharactersPerLineCount() | 确定将在选项窗格文本中自动插入换行符的位置。 (默认值为Integer.MAX_VALUE .)要使用此方法,必须创建JOptionPane 子类。例如,以下代码导致选项窗格中每行只有一个单词,这是因为字符串 中的每个单词等于或少于 5 个字符:JOptionPane op = new JOptionPane(“这是文本.”){ public int getMaxCharactersPerLineCount(){ return 5; } }; |
使用对话框的示例
下表列出了使用JOptionPane
或JDialog
的示例。要查找使用对话框的其他示例,请参见progress bars,color choosers和file choosers的示例列表。
Example | Where Described | Notes | |
---|---|---|---|
DialogDemo, | |||
CustomDialog | 此部分 | 使用JOptionPane 和JDialog 创建多种对话框。 | |
Framework | — | 当用户选择“退出”菜单项时,弹出确认对话框。 | |
ListDialog | 如何使用 BoxLayout | 将执行包含滚动列表和两个按钮的 Pattern 对话框。除了 Util 方法getFrameForComponent 之外,不使用JOptionPane 。 |