Java 中文官方教程 2022 版(十五)(2)https://developer.aliyun.com/article/1486398
在上一个代码片段中,JColorChooser
构造函数接受一个Color
参数,该参数指定了选择器的初始选定颜色。如果您没有指定初始颜色,则颜色选择器将显示Color.white
。请查看Color
API 文档以获取可用的颜色常量列表。
颜色选择器使用ColorSelectionModel
的实例来包含和管理当前选择。颜色选择模型在用户更改颜色时触发更改事件。示例程序向颜色选择模型注册了更改侦听器,以便能够更新窗口顶部的横幅。以下代码注册并实现了更改侦听器:
tcc.getSelectionModel().addChangeListener(this); . . . public void stateChanged(ChangeEvent e) { Color newColor = tcc.getColor(); banner.setForeground(newColor); }
有关更改侦听器和更改事件的一般信息,请参阅如何编写更改侦听器。
像示例程序中使用的基本颜色选择器对于许多程序来说已经足够了。然而,颜色选择器 API 允许您通过提供自己设计的预览面板、向其添加自定义选择器面板或移除颜色选择器中的现有选择器面板来自定义颜色选择器。此外,JColorChooser
类提供了两个方法,使得在对话框中使用颜色选择器变得简单。
本节的其余部分讨论以下主题:
- 另一个示例:ColorChooserDemo2
- 在对话框中显示颜色选择器
- 移除或替换预览面板
- 创建自定义选择器面板
- 颜色选择器 API
- 使用颜色选择器的示例
另一个示例:ColorChooserDemo2
现在让我们转向 ColorChooserDemo2,这是前一个演示程序的修改版本,使用了更多的JColorChooser
API。
试试这个:
- 点击启动按钮以使用Java™ Web Start运行 ColorChooser Demo(下载 JDK)。或者,要自己编译和运行示例,请参考示例索引。
这里是 ColorChooserDemo2 的图片:
该程序自定义了横幅文本颜色选择器的方式如下:
- 移除预览面板
- 移除所有默认的选择器面板
- 添加一个自定义选择器面板
移除或替换预览面板涵盖了第一个自定义。创建自定义选择器面板讨论了后两个。
该程序还添加了一个按钮,点击后会在对话框中打开一个颜色选择器,您可以用它来设置横幅的背景颜色。
在对话框中显示颜色选择器
JColorChooser
类提供了两个类方法,使得在对话框中使用颜色选择器变得简单。ColorChooserDemo2 使用其中一个方法,showDialog
,当用户点击**显示颜色选择器…**按钮时,会显示背景颜色选择器的对话框。以下是示例中用于在对话框中打开背景颜色选择器的单行代码:
Color newColor = JColorChooser.showDialog( ColorChooserDemo2.this, "Choose Background Color", banner.getBackground());
第一个参数是对话框的父级,第二个是对话框标题,第三个是初始选择的颜色。
对话框在三种情况下消失:用户选择颜色并点击确定按钮,用户使用取消按钮取消操作,或用户使用框架控件关闭对话框。如果用户选择了颜色,showDialog
方法将返回新颜色。如果用户取消操作或关闭窗口,则该方法返回 null
。以下是根据 showDialog
返回值更新横幅背景颜色的示例代码:
if (newColor != null) { banner.setBackground(newColor); }
showDialog
创建的对话框是模态的。如果你想要一个非模态对话框,可以使用 JColorChooser
的 createDialog
方法来创建对话框。这个方法还允许你为对话框窗口中的确定和取消按钮指定动作监听器。使用 JDialog
的 show
方法来显示这个方法创建的对话框。有关使用此方法的示例,请参见指定其他编辑器中的如何使用表格部分。
移除或替换预览面板
默认情况下,颜色选择器显示一个预览面板。ColorChooserDemo2 使用以下代码移除文本颜色选择器的预览面板:
tcc.setPreviewPanel(new JPanel());
这将有效地移除预览面板,因为普通的 JPanel
没有大小和默认视图。要将预览面板恢复为默认设置,请使用 setPreviewPanel
的参数为 null
。
要提供自定义预览面板,还要使用 setPreviewPanel
。你传递给该方法的组件应该继承自 JComponent
,指定一个合理的大小,并提供当前颜色的自定义视图。要在用户更改颜色选择器中的颜色时收到通知,预览面板必须像之前描述的那样在颜色选择器的颜色选择模型上注册为更改监听器。
创建自定义选择器面板
默认颜色选择器提供五个选择器面板:
- 色板 — 用于从一组色板中选择颜色。
- HSV — 用于使用色调-饱和度-亮度颜色表示选择颜色。在 JDK 7 之前,这被称为 HSB,代表色调-饱和度-亮度。
- HSL — 用于使用色调-饱和度-亮度颜色表示选择颜色。这是 JDK 7 中的新功能。
- RGB — 用于使用红-绿-蓝颜色模型选择颜色。
- CMYK — 用于使用过程颜色或四色模型选择颜色。这是 JDK 7 中的新功能。
你可以通过使用 addChooserPanel
添加自己设计的选择器面板来扩展默认颜色选择器,或者通过使用 removeChooserPanel
删除选择器面板来限制它。
如果要删除所有默认的选择器面板并添加一个或多个自定义面板,可以通过单个调用setChooserPanels
来实现。ColorChooserDemo2 使用此方法将默认选择器面板替换为CrayonPanel
的实例,一个自定义选择器面板。以下是来自该示例的setChooserPanels
调用:
//Override the chooser panels with our own. AbstractColorChooserPanel panels[] = { new CrayonPanel() }; tcc.setChooserPanels(panels);
代码很简单:它创建一个包含CrayonPanel
的数组。接下来,代码调用setChooserPanels
将数组的内容设置为颜色选择器的选择器面板。
CrayonPanel
是AbstractColorChooserPanel
的子类,并重写了其超类中定义的五个抽象方法:
void buildChooser()
创建包含选择器面板的 GUI。示例创建四个切换按钮 — 每个代表一个蜡笔 — 并将它们添加到选择器面板中。
void updateChooser()
每当显示选择器面板时,将调用此方法。此方法的实现选择代表当前选定颜色的切换按钮。
public void updateChooser() { Color color = getColorFromModel(); if (Color.red.equals(color)) { redCrayon.setSelected(true); } else if (Color.yellow.equals(color)) { yellowCrayon.setSelected(true); } else if (Color.green.equals(color)) { greenCrayon.setSelected(true); } else if (Color.blue.equals(color)) { blueCrayon.setSelected(true); } }
String getDisplayName()
返回选择器面板的显示名称。该名称用于选择器面板的选项卡上。以下是示例getDisplayName
方法:
public String getDisplayName() { return "Crayons"; }
Icon getSmallDisplayIcon()
返回一个小图标来表示此选择器面板。目前未使用。将来的颜色选择器版本可能会使用此图标或大图标来表示此选择器面板在显示中的位置。此方法的示例实现返回null
。
Icon getLargeDisplayIcon()
返回一个大图标来表示此选择器面板。目前未使用。将来的颜色选择器版本可能会使用此图标或小图标来表示此选择器面板在显示中的位置。此方法的示例实现返回null
。
颜色选择器 API
以下表格列出了常用的JColorChooser
构造函数和方法。您可能调用的其他方法在 The JComponent Class 的 API 表中列出。使用颜色选择器的 API 分为以下几类:
- 创建和显示颜色选择器
- 自定义颜色选择器 GUI
- 设置或获取当前颜色
创建和显示颜色选择器
方法或构造函数 | 目的 |
| JColorChooser() JColorChooser(Color)
JColorChooser(ColorSelectionModel) | 创建一个颜色选择器。默认构造函数创建一个初始颜色为Color.white
的颜色选择器。使用第二个构造函数指定不同的初始颜色。当存在ColorSelectionModel
参数时,为颜色选择器提供颜色选择模型。 |
Color showDialog(Component, String, Color) | 创建并显示一个颜色选择器在模态对话框中。Component 参数是对话框的父级,String 参数指定对话框标题,Color 参数指定选择器的初始颜色。 |
| [JDialog createDialog(Component, String, boolean, JColorChooser, ActionListener,
ActionListener)](https://docs.oracle.com/javase/8/docs/api/javax/swing/JColorChooser.html#createDialog-java.awt.Component-java.lang.String-boolean-javax.swing.JColorChooser-java.awt.event.ActionListener-java.awt.event.ActionListener-) | 为指定的颜色选择器创建对话框。与showDialog
一样,Component
参数是对话框的父级,String
参数指定对话框标题。其他参数如下:boolean
指定对话框是否为模态,JColorChooser
是要在对话框中显示的颜色选择器,第一个ActionListener
是为确定按钮,第二个是为取消按钮。 |
自定义颜色选择器的 GUI
方法 | 目的 |
void setPreviewPanel(JComponent) JComponent getPreviewPanel() | 设置或获取用于预览颜色选择的组件。要移除预览面板,请使用new JPanel() 作为参数。要指定默认预览面板,请使用null 。 |
void setChooserPanels(AbstractColorChooserPanel[]) AbstractColorChooserPanel[] getChooserPanels() | 设置或获取颜色选择器中的选择面板。 |
void addChooserPanel(AbstractColorChooserPanel) AbstractColorChooserPanel removeChooserPanel(AbstractColorChooserPanel) | 向颜色选择器添加选择器面板或从中移除选择器面板。 |
void setDragEnabled(boolean) boolean getDragEnabled() | 设置或获取dragEnabled 属性,该属性必须为 true 才能在此组件上启用拖放处理。默认值为 false。有关更多详细信息,请参阅拖放和数据传输。 |
设置或获取当前颜色
方法 | 目的 |
| void setColor(Color) void setColor(int, int, int)
Color getColor() | 设置或获取当前选择的颜色。setColor
方法的三个整数版本将这三个整数一起解释为 RGB 颜色。setColor
方法的单个整数版本将整数分成四个 8 位字节,并按以下方式解释整数为 RGB 颜色: |
void setSelectionModel(ColorSelectionModel) ColorSelectionModel getSelectionModel() | 设置或获取颜色选择器的选择模型。该对象包含当前选择,并在选择更改时向注册的侦听器触发更改事件。 |
使用颜色选择器的示例
此表显示使用JColorChooser
的示例以及这些示例的描述位置。
示例 | 描述位置 | 注意事项 |
ColorChooserDemo | 此部分 | 使用标准颜色选择器。 |
ColorChooserDemo2 | 此部分 | 在使用showDialog 创建的对话框中使用一个自定义颜色选择器和一个标准颜色选择器。 |
TableDialogEditDemo | 如何使用表格 | 展示如何在表格中使用颜色选择器作为自定义单元格编辑器。该示例中使用的颜色选择器是通过createDialog 创建的。 |
BasicDnD | DnD 简介 | 使用不在对话框中的颜色选择器;演示了 Swing 组件的默认拖放功能,包括颜色选择器。 |
如何使用组合框
原文:
docs.oracle.com/javase/tutorial/uiswing/components/combobox.html
一个JComboBox
,允许用户选择多个选择项之一,可以有两种非常不同的形式。默认形式是不可编辑的组合框,其中包含一个按钮和一个值的下拉列表。第二种形式称为可编辑的组合框,其中包含一个与之相邻的小按钮的文本字段。用户可以在文本字段中键入一个值或单击按钮以显示下拉列表。以下是 Java 外观中两种形式的组合框的样子:
不可编辑的组合框,在按钮被点击前(顶部)和之后 | 可编辑的组合框,在箭头按钮被点击前和之后 |
组合框需要很少的屏幕空间,它们的可编辑(文本字段)形式对于让用户快速选择一个值而不限制用户在显示的值上是有用的。其他可以显示多个选择项之一的组件包括单选按钮和列表组。单选按钮组通常是用户最容易理解的,但当空间有限或有多个选择项可用时,组合框可能更合适。列表并不是非常吸引人,但当项目数量较大(比如超过 20 个)或选择多个项目可能是有效的时,它们比组合框更合适。
由于可编辑和不可编辑的组合框非常不同,因此本节将它们分开处理。本节涵盖以下主题:
- 使用不可编辑的组合框
- 处理组合框上的事件
- 使用可编辑的组合框
- 提供自定义渲染器
- 组合框 API
- 使用组合框的示例
使用不可编辑的组合框
此处显示的应用程序使用不可编辑的组合框来选择宠物图片:
试试这个:
- 单击“启动”按钮以使用Java™ Web Start运行 ComboBox Demo(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
- 从组合框中选择一个动物名称以查看其图片。
- 将此程序的操作和 GUI 与使用单选按钮的程序进行比较:运行 RadioButtonDemo(需要版本 6)。您可能还想比较源代码:
ComboBoxDemo.java
vs.RadioButtonDemo.java
。
下面的代码取自ComboBoxDemo.java
,创建一个不可编辑的组合框并设置它:
String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; //Create the combo box, select item at index 4. //Indices start at 0, so 4 specifies the pig. JComboBox petList = new JComboBox(petStrings); petList.setSelectedIndex(4); petList.addActionListener(this);
这个组合框包含一个字符串数组,但您也可以使用图标。要将其他内容放入组合框或自定义组合框中的项目外观,您需要编写自定义渲染器。可编辑的组合框还需要一个自定义编辑器。请参考提供自定义渲染器以获取信息和示例。
前面的代码在组合框上注册了一个动作监听器。要查看动作监听器的实现并了解组合框支持的其他类型的监听器,请参考处理组合框上的事件。
无论使用哪个构造函数,组合框都使用组合框模型来包含和管理其菜单中的项目。当您使用数组或向量初始化组合框时,组合框会为您创建一个默认的模型对象。与其他 Swing 组件一样,您可以通过实现自定义模型(实现ComboBoxModel
接口的对象)来部分自定义组合框。
注意:
在为组合框实现自定义模型时要小心。JComboBox
中更改组合框菜单中项目的方法,如insertItemAt
,仅在数据模型实现MutableComboBoxModel
接口(ComboBoxModel
的子接口)时才有效。请参考 API 表以查看受影响的方法。
还要注意的另一件事是,即使对于不可编辑的组合框,也要确保您的自定义模型在组合框的数据或状态更改时触发 list data events。即使数据永远不会更改的不可变组合框模型,在选择更改时也必须触发列表数据事件(CONTENTS_CHANGED
事件)。一个简单的方法是将您的组合框模型作为AbstractListModel
的子类,以获得列表数据事件触发代码。
处理组合框上的事件
这是在ComboBoxDemo.java
中注册和实现组合框上动作监听器的代码:
public class ComboBoxDemo ... implements ActionListener { . . . petList.addActionListener(this) { . . . public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); String petName = (String)cb.getSelectedItem(); updateLabel(petName); } . . . }
此动作侦听器从组合框中获取新选择的项目,使用它来计算图像文件的名称,并更新标签以显示图像。当用户从组合框菜单中选择项目时,组合框会触发一个动作事件。有关实现动作侦听器的一般信息,请参阅如何编写动作侦听器。
组合框还会生成项目事件,当任何项目的选择状态发生变化时会触发这些事件。在组合框中一次只能选择一个项目,因此当用户进行新选择时,先前选择的项目将取消选择。因此,每次用户从菜单中选择不同项目时都会触发两个项目事件。如果用户选择相同项目,则不会触发项目事件。使用addItemListener
在组合框上注册项目侦听器。如何编写项目侦听器提供了有关实现项目侦听器的一般信息。
尽管JComboBox
继承了用于注册低级事件的方法 — 例如焦点、键盘和鼠标事件 — 但我们建议不要在组合框上监听低级事件。原因在于:组合框是一个复合组件 — 它由两个或更多其他组件组成。组合框本身会触发高级事件,如动作事件。其子组件会触发低级事件,如鼠标、键盘和焦点事件。低级事件和触发它们的子组件是与外观相关的。为了避免编写与外观相关的代码,您应该只在复合组件(如组合框)上监听高级事件。有关事件的信息,包括有关高级和低级事件的讨论,请参阅编写事件侦听器。
使用可编辑的组合框
这是一个演示应用程序的图片,该应用程序使用可编辑的组合框来输入用于格式化日期的模式。
试试这个:
- 点击“启动”按钮以使用Java™ Web Start运行 ComboBox2 演示(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
- 通过从组合框菜单中选择一个新模式来输入新模式。程序会重新格式化当前日期和时间。
- 通过键入一个新模式并按 Enter 来输入新模式。程序会再次重新格式化当前日期和时间。
以下代码取自ComboBoxDemo2.java
,创建并设置了组合框:
String[] patternExamples = { "dd MMMMM yyyy", "dd.MM.yy", "MM/dd/yy", "yyyy.MM.dd G 'at' hh:mm:ss z", "EEE, MMM d, ''yy", "h:mm a", "H:mm:ss:SSS", "K:mm a,z", "yyyy.MMMMM.dd GGG hh:mm aaa" }; . . . JComboBox patternList = new JComboBox(patternExamples); patternList.setEditable(true); patternList.addActionListener(this);
此代码与前一个示例非常相似,但需要解释几句。粗体代码明确打开编辑以允许用户输入值。这是必要的,因为默认情况下,组合框不可编辑。此特定示例允许在组合框上进行编辑,因为其菜单不提供所有可能的日期格式化模式,只提供常用模式的快捷方式。
可编辑的组合框在用户从菜单中选择项目和用户键入 Enter 时会触发动作事件。请注意,当用户在组合框中输入值时,菜单保持不变。如果需要,您可以轻松编写一个动作侦听器,每次用户键入唯一值时都向组合框的菜单添加一个新项目。
请参阅国际化以了解有关格式化日期和其他类型数据的更多信息。
提供自定义渲染器
组合框使用渲染器来显示其菜单中的每个项目。如果组合框不可编辑,则还使用渲染器来显示当前选定的项目。另一方面,可编辑的组合框使用编辑器来显示所选项目。组合框的渲染器必须实现ListCellRenderer
接口。组合框的编辑器必须实现ComboBoxEditor
。本节展示了如何为不可编辑的组合框提供自定义渲染器。
默认渲染器知道如何渲染字符串和图标。如果您将其他对象放入组合框中, 默认渲染器将调用toString
方法提供要显示的字符串。您可以通过实现自己的ListCellRenderer
来自定义组合框及其项目的渲染方式。
这是一个使用具有自定义渲染器的组合框的应用程序的图片:
单击“启动”按钮以使用Java™ Web Start运行 CustomComboBox 演示(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
此示例的完整源代码位于CustomComboBoxDemo.java
中。要获取所需的图像文件,请参考示例索引。
示例中的以下语句创建了ComboBoxRenderer
(一个自定义类)的实例,并将该实例设置为组合框的渲染器:
JComboBox petList = new JComboBox(intArray); . . . ComboBoxRenderer renderer = new ComboBoxRenderer(); renderer.setPreferredSize(new Dimension(200, 130)); petList.setRenderer(renderer); petList.setMaximumRowCount(3);
最后一行设置了组合框的最大行数,这决定了菜单显示时可见的项目数量。如果组合框中的项目数量大于其最大行数,则菜单会有滚动条。菜单中的图标对于一个菜单来说相当大,因此我们的代码将行数限制为 3。这是ComboBoxRenderer
的实现,一个将图标和文本并排放置的渲染器:
class ComboBoxRenderer extends JLabel implements ListCellRenderer { . . . public ComboBoxRenderer() { setOpaque(true); setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); } /* * This method finds the image and text corresponding * to the selected value and returns the label, set up * to display the text and image. */ public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { //Get the selected index. (The index parameter isn't //always valid, so just use the value.) int selectedIndex = ((Integer)value).intValue(); if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } //Set the icon and text. If icon was null, say so. ImageIcon icon = images[selectedIndex]; String pet = petStrings[selectedIndex]; setIcon(icon); if (icon != null) { setText(pet); setFont(list.getFont()); } else { setUhOhText(pet + " (no image available)", list.getFont()); } return this; } . . . }
作为ListCellRenderer
,ComboBoxRenderer
实现了一个名为getListCellRendererComponent
的方法,该方法返回一个组件,其paintComponent
方法用于显示组合框及其每个项目。显示图像和图标的最简单方法是使用标签。因此,ComboBoxRenderer
是标签的子类并返回自身。getListCellRendererComponent
的实现配置了渲染器以显示当前选定的图标及其描述。
这些参数被传递给getListCellRendererComponent
:
JList list
— 用于在幕后显示项目的列表对象。示例使用此对象的颜色来设置前景色和背景色。Object value
— 要渲染的对象。在本例中是一个Integer
。int index
— 要渲染的对象的索引。boolean isSelected
— 指示要渲染的对象是否被选中。示例使用它来确定使用哪些颜色。boolean cellHasFocus
— 指示要渲染的对象是否具有焦点。
请注意,组合框和列表使用相同类型的渲染器 — ListCellRenderer
。如果对于您的程序有意义,您可以通过在组合框和列表之间共享渲染器来节省一些时间。
组合框 API
以下表列出了常用的JComboBox
构造函数和方法。您最有可能在JComboBox
对象上调用的其他方法是从其超类继承的方法,例如setPreferredSize
。请参阅 The JComponent API 以查看常用继承方法的表格。
使用组合框的 API 分为两类:
- 设置或获取组合框菜单中的项目
- 自定义组合框的操作
设置或获取组合框菜单中的项目
方法 | 目的 |
| JComboBox() JComboBox(ComboBoxModel)
JComboBox(Vector) | 创建一个具有指定项目的组合框菜单。使用默认构造函数创建的组合框初始时没有项目在菜单中。其他每个构造函数都从其参数初始化菜单:一个模型对象,一个对象数组或一个Vector
对象。
void addItem(Object) void insertItemAt(Object, int) | 将指定对象添加或插入到组合框菜单中。插入方法将指定对象放在指定索引处,因此在该索引处当前对象之前插入它。这些方法要求组合框的数据模型是MutableComboBoxModel 的实例。 |
Object getItemAt(int) Object getSelectedItem() | 从组合框菜单中获取一个项目。 |
| void removeAllItems() void removeItemAt(int)
void removeItem(Object) | 从组合框菜单中移除一个或多个项目。这些方法要求组合框的数据模型是MutableComboBoxModel
的实例。
int getItemCount() | 获取组合框菜单中项目的数量。 |
void setModel(ComboBoxModel) ComboBoxModel getModel() | 设置或获取提供组合框菜单中项目的数据模型。 |
void setAction(Action) Action getAction() | 设置或获取与组合框关联的Action 。有关更多信息,请参阅如何使用操作。 |
自定义组合框的操作
方法或构造函数 | 目的 |
void addActionListener(ActionListener) | 向组合框添加动作监听器。当用户从组合框菜单中选择项目时,或者在可编辑的组合框中,当用户按下 Enter 键时,将调用监听器的actionPerformed 方法。 |
void addItemListener(ItemListener) | 向组合框添加项目监听器。当任何组合框项目的选择状态发生变化时,将调用监听器的itemStateChanged 方法。 |
void setEditable(boolean) boolean isEditable() | 设置或获取用户是否可以在组合框中输入。 |
void setRenderer(ListCellRenderer) ListCellRenderer getRenderer() | 设置或获取负责在组合框中绘制所选项目的对象。仅当组合框不可编辑时才使用渲染器。如果组合框是可编辑的,则编辑器用于绘制所选项目。 |
void setEditor(ComboBoxEditor) ComboBoxEditor getEditor() | 设置或获取负责在组合框中绘制和编辑所选项目的对象。仅当组合框可编辑时才使用编辑器。如果组合框不可编辑,则使用渲染器来绘制所选项目。 |
使用组合框的示例
这个表格展示了使用JComboBox
的示例以及这些示例的描述位置。
示例 | 描述位置 | 注释 |
ComboBoxDemo |
这一部分 | 使用不可编辑的组合框。 |
ComboBoxDemo2 |
这一部分 | 使用可编辑的组合框。 |
CustomComboBoxDemo |
这一部分 | 为组合框提供自定义渲染器。 |
TableRenderDemo |
如何使用表格(将组合框用作编辑器) | 展示了如何将组合框用作表格单元格编辑器。 |
如何制作对话框
原文:
docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
对话框窗口是一个独立的子窗口,用于在主 Swing 应用程序窗口之外显示临时通知。大多数对话框向用户呈现错误消息或警告,但对话框也可以呈现图像、目录树或与管理它们的主要 Swing 应用程序兼容的任何内容。
为了方便起见,几个 Swing 组件类可以直接实例化和显示对话框。要创建简单的标准对话框,您可以使用 JOptionPane
类。ProgressMonitor
类可以显示操作的进度对话框。另外两个类,JColorChooser
和 JFileChooser
,也提供标准对话框。要打开打印对话框,您可以使用打印 API。要创建自定义对话框,请直接使用 JDialog
类。
简单对话框的代码可以很简洁。例如,这是一个信息对话框:
以下是创建和显示它的代码:
JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.");
本节的其余部分涵盖以下主题:
- 对话框概述
- 对话框示例
- JOptionPane 功能
- 创建和显示简单对话框
- 自定义按钮文本
- 从对话框获取用户输入
- 停止自动关闭对话框
- 对话框 API
- 使用对话框的示例
对话框概述
每个对话框都依赖于一个 Frame 组件。当该 Frame 被销毁时,其依赖的对话框也会被销毁。当 Frame 最小化时,其依赖的对话框也会从屏幕上消失。当 Frame 最大化时,其依赖的对话框会重新显示在屏幕上。Swing 的 JDialog 类从 AWT 的 Dialog
类继承了这种行为。
对话框可以是模态的。当模态对话框可见时,它会阻止用户对程序中所有其他窗口的输入。JOptionPane 创建的 JDialog
是模态的。要创建非模态对话框,必须直接使用 JDialog
类。
从 JDK 7 开始,您可以使用新的 Modality API 修改对话框窗口的模态行为。详情请参阅新的 Modality API。
JDialog
类是 AWT java.awt.Dialog
类的子类。它为 Dialog
对象添加了一个根窗格容器和默认关闭操作的支持。这些都是 JFrame
具有的相同特性,直接使用 JDialog
非常类似于使用 JFrame
。如果你要直接使用 JDialog
,那么你应该了解 使用顶层容器 和 如何创建框架 中的内容,特别是 响应窗口关闭事件。
即使你使用 JOptionPane
实现对话框,背后仍然使用 JDialog
。原因是 JOptionPane
只是一个容器,可以自动创建一个 JDialog
并将自身添加到 JDialog
的内容窗格中。
Java 中文官方教程 2022 版(十五)(4)https://developer.aliyun.com/article/1486405