http://zetcode.com/tutorials/javaswingtutorial/swingdialogs/

对话框窗口或对话框是大多数现代 GUI 应用必不可少的部分。 对话被定义为两个或更多人之间的对话。 在计算机应用中,对话框是一个窗口,用于与应用“对话”。 对话框用于输入数据,修改数据,更改应用设置等。对话框是用户与计算机程序之间进行通信的重要手段。

在 Java Swing 中,我们可以创建两种对话框:标准对话框和自定义对话框。自定义对话框由程序员创建。 它们基于JDialog类。标准对话框是 Swing 工具箱中可用的预定义对话框,例如JColorChooserJFileChooser。 这些是用于常见编程任务的对话框,例如显示文本,接收输入,加载和保存文件。 它们节省了程序员的时间,并增强了一些标准行为。

对话框有两种基本类型:模态对话框和非模态对话框。模态对话框阻止输入到其他顶级窗口。非模态对话框允许输入其他窗口。 打开文件对话框是模态对话框的一个很好的例子。 选择要打开的文件时,不应进行其他操作。 典型的非模态对话框是查找文本对话框。 能够在文本控件中移动光标并定义从何处开始查找特定文本很方便。

MessageDialog

消息对话框是向用户提供信息的简单对话框。 消息对话框是使用JOptionPane.showMessageDialog()方法创建的。

MessageDialogsEx.java

  1. package com.zetcode;
  2. import javax.swing.GroupLayout;
  3. import javax.swing.JButton;
  4. import javax.swing.JComponent;
  5. import javax.swing.JFrame;
  6. import javax.swing.JOptionPane;
  7. import javax.swing.JPanel;
  8. import java.awt.EventQueue;
  9. import static javax.swing.GroupLayout.DEFAULT_SIZE;
  10. public class MessageDialogsEx extends JFrame {
  11. private JPanel pnl;
  12. public MessageDialogsEx() {
  13. initUI();
  14. }
  15. private void initUI() {
  16. pnl = (JPanel) getContentPane();
  17. var warBtn = new JButton("Warning");
  18. var errBtn = new JButton("Error");
  19. var queBtn = new JButton("Question");
  20. var infBtn = new JButton("Information");
  21. warBtn.addActionListener(event -> JOptionPane.showMessageDialog(pnl,
  22. "A deprecated call!", "Warning", JOptionPane.WARNING_MESSAGE));
  23. errBtn.addActionListener(event -> JOptionPane.showMessageDialog(pnl,
  24. "Could not open file!", "Error", JOptionPane.ERROR_MESSAGE));
  25. queBtn.addActionListener(event -> JOptionPane.showMessageDialog(pnl,
  26. "Are you sure to quit?", "Question", JOptionPane.QUESTION_MESSAGE));
  27. infBtn.addActionListener(event -> JOptionPane.showMessageDialog(pnl,
  28. "Download completed.", "Information",
  29. JOptionPane.INFORMATION_MESSAGE));
  30. createLayout(warBtn, errBtn, queBtn, infBtn);
  31. setTitle("Message dialogs");
  32. setSize(300, 200);
  33. setLocationRelativeTo(null);
  34. setDefaultCloseOperation(EXIT_ON_CLOSE);
  35. }
  36. private void createLayout(JComponent... arg) {
  37. var pane = getContentPane();
  38. var gl = new GroupLayout(pane);
  39. pane.setLayout(gl);
  40. gl.setAutoCreateGaps(true);
  41. gl.setHorizontalGroup(gl.createSequentialGroup()
  42. .addContainerGap(DEFAULT_SIZE, Short.MAX_VALUE)
  43. .addGroup(gl.createParallelGroup()
  44. .addComponent(arg[0])
  45. .addComponent(arg[2]))
  46. .addGroup(gl.createParallelGroup()
  47. .addComponent(arg[1])
  48. .addComponent(arg[3]))
  49. .addContainerGap(DEFAULT_SIZE, Short.MAX_VALUE)
  50. );
  51. gl.setVerticalGroup(gl.createSequentialGroup()
  52. .addContainerGap(DEFAULT_SIZE, Short.MAX_VALUE)
  53. .addGroup(gl.createParallelGroup()
  54. .addComponent(arg[0])
  55. .addComponent(arg[1]))
  56. .addGroup(gl.createParallelGroup()
  57. .addComponent(arg[2])
  58. .addComponent(arg[3]))
  59. .addContainerGap(DEFAULT_SIZE, Short.MAX_VALUE)
  60. );
  61. gl.linkSize(arg[0], arg[1], arg[2], arg[3]);
  62. pack();
  63. }
  64. public static void main(String[] args) {
  65. EventQueue.invokeLater(() -> {
  66. var md = new MessageDialogsEx();
  67. md.setVisible(true);
  68. });
  69. }
  70. }

该示例显示了错误,警告,问题和信息消息对话框。

  1. var warBtn = new JButton("Warning");
  2. var errBtn = new JButton("Error");
  3. var queBtn = new JButton("Question");
  4. var infBtn = new JButton("Information");

这四个按钮显示四个不同的消息对话框。

  1. errBtn.addActionListener(event -> JOptionPane.showMessageDialog(pnl,
  2. "Could not open file!", "Error", JOptionPane.ERROR_MESSAGE));

要创建消息对话框,我们调用JOptionPane类的静态showMessageDialog()方法。 我们提供对话框的父项,消息文本,标题和消息类型。 消息类型是以下常量之一:

  • ERROR_MESSAGE
  • WARNING_MESSAGE
  • QUESTION_MESSAGE
  • INFORMATION_MESSAGE

显示的图标取决于此常数。

Java Swing 对话框 - 图1

图:问题消息对话框

自定义对话框

在下面的示例中,我们创建一个简单的自定义对话框。 它是有关在许多 GUI 应用中找到的对话框的示例,通常位于“帮助”菜单中。

CustomDialogEx.java

  1. package com.zetcode;
  2. import javax.swing.Box;
  3. import javax.swing.GroupLayout;
  4. import javax.swing.ImageIcon;
  5. import javax.swing.JButton;
  6. import javax.swing.JComponent;
  7. import javax.swing.JDialog;
  8. import javax.swing.JFrame;
  9. import javax.swing.JLabel;
  10. import javax.swing.JMenu;
  11. import javax.swing.JMenuBar;
  12. import javax.swing.JMenuItem;
  13. import java.awt.EventQueue;
  14. import java.awt.Font;
  15. import java.awt.Frame;
  16. import java.awt.event.ActionEvent;
  17. import java.awt.event.ActionListener;
  18. import java.awt.event.KeyEvent;
  19. import static javax.swing.GroupLayout.Alignment.CENTER;
  20. class AboutDialog extends JDialog {
  21. public AboutDialog(Frame parent) {
  22. super(parent);
  23. initUI();
  24. }
  25. private void initUI() {
  26. var icon = new ImageIcon("src/resources/notes.png");
  27. var imgLabel = new JLabel(icon);
  28. var textLabel = new JLabel("Notes, 1.23");
  29. textLabel.setFont(new Font("Serif", Font.BOLD, 13));
  30. var okBtn = new JButton("OK");
  31. okBtn.addActionListener(event -> dispose());
  32. createLayout(textLabel, imgLabel, okBtn);
  33. setModalityType(ModalityType.APPLICATION_MODAL);
  34. setTitle("About Notes");
  35. setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  36. setLocationRelativeTo(getParent());
  37. }
  38. private void createLayout(JComponent... arg) {
  39. var pane = getContentPane();
  40. var gl = new GroupLayout(pane);
  41. pane.setLayout(gl);
  42. gl.setAutoCreateContainerGaps(true);
  43. gl.setAutoCreateGaps(true);
  44. gl.setHorizontalGroup(gl.createParallelGroup(CENTER)
  45. .addComponent(arg[0])
  46. .addComponent(arg[1])
  47. .addComponent(arg[2])
  48. .addGap(200)
  49. );
  50. gl.setVerticalGroup(gl.createSequentialGroup()
  51. .addGap(30)
  52. .addComponent(arg[0])
  53. .addGap(20)
  54. .addComponent(arg[1])
  55. .addGap(20)
  56. .addComponent(arg[2])
  57. .addGap(30)
  58. );
  59. pack();
  60. }
  61. }
  62. public class CustomDialogEx extends JFrame
  63. implements ActionListener {
  64. public CustomDialogEx() {
  65. initUI();
  66. }
  67. private void initUI() {
  68. createMenuBar();
  69. setTitle("Simple Dialog");
  70. setSize(350, 250);
  71. setLocationRelativeTo(null);
  72. setDefaultCloseOperation(EXIT_ON_CLOSE);
  73. }
  74. private void createMenuBar() {
  75. var menubar = new JMenuBar();
  76. var fileMenu = new JMenu("File");
  77. fileMenu.setMnemonic(KeyEvent.VK_F);
  78. var helpMenu = new JMenu("Help");
  79. helpMenu.setMnemonic(KeyEvent.VK_H);
  80. var aboutMemuItem = new JMenuItem("About");
  81. aboutMemuItem.setMnemonic(KeyEvent.VK_A);
  82. helpMenu.add(aboutMemuItem);
  83. aboutMemuItem.addActionListener(this);
  84. menubar.add(fileMenu);
  85. menubar.add(Box.createGlue());
  86. menubar.add(helpMenu);
  87. setJMenuBar(menubar);
  88. }
  89. @Override
  90. public void actionPerformed(ActionEvent e) {
  91. showAboutDialog();
  92. }
  93. private void showAboutDialog() {
  94. var aboutDialog = new AboutDialog(this);
  95. aboutDialog.setVisible(true);
  96. }
  97. public static void main(String[] args) {
  98. EventQueue.invokeLater(() -> {
  99. var ex = new CustomDialogEx();
  100. ex.setVisible(true);
  101. });
  102. }
  103. }

从“帮助”菜单中,我们可以弹出一个小对话框。 该对话框显示文本,图标和按钮。

  1. class AboutDialog extends JDialog {

自定义对话框基于JDialog类。

  1. setModalityType(ModalityType.APPLICATION_MODAL);

setModalityType()方法设置对话框的模态类型。 ModalityType.APPLICATION_MODAL阻止来自同一应用的所有顶级窗口的输入。 在我们的例子中,在对话框的生存期内,应用框架的输入被阻止。

  1. setLocationRelativeTo(getParent());

setLocationRelativeTo()方法将对话框窗口居中在框架窗口的区域上方。

  1. setDefaultCloseOperation(DISPOSE_ON_CLOSE);

setDefaultCloseOperation()设置用户单击窗口的“关闭”按钮时发生的情况。 该对话框将被隐藏和处置。

  1. private void showAboutDialog() {
  2. var aboutDialog = new AboutDialog(this);
  3. aboutDialog.setVisible(true);
  4. }

对话框窗口使用setVisible()方法显示在屏幕上。

Java Swing 对话框 - 图2

图:自定义对话框

JFileChooser

JFileChooser是用于从文件系统中选择文件的标准对话框。

FileChooserEx.java

  1. package com.zetcode;
  2. import javax.swing.AbstractAction;
  3. import javax.swing.GroupLayout;
  4. import javax.swing.ImageIcon;
  5. import javax.swing.JButton;
  6. import javax.swing.JComponent;
  7. import javax.swing.JFileChooser;
  8. import javax.swing.JFrame;
  9. import javax.swing.JOptionPane;
  10. import javax.swing.JPanel;
  11. import javax.swing.JScrollPane;
  12. import javax.swing.JTextArea;
  13. import javax.swing.JToolBar;
  14. import javax.swing.filechooser.FileNameExtensionFilter;
  15. import java.awt.EventQueue;
  16. import java.awt.event.ActionEvent;
  17. import java.io.File;
  18. import java.io.IOException;
  19. import java.nio.file.Files;
  20. import java.nio.file.Paths;
  21. import static javax.swing.GroupLayout.DEFAULT_SIZE;
  22. public class FileChooserEx extends JFrame {
  23. private JPanel panel;
  24. private JTextArea area;
  25. public FileChooserEx() {
  26. initUI();
  27. }
  28. private void initUI() {
  29. panel = (JPanel) getContentPane();
  30. area = new JTextArea();
  31. var spane = new JScrollPane();
  32. spane.getViewport().add(area);
  33. var toolbar = createToolBar();
  34. createLayout(toolbar, spane);
  35. setTitle("JFileChooser");
  36. setSize(400, 300);
  37. setLocationRelativeTo(null);
  38. setDefaultCloseOperation(EXIT_ON_CLOSE);
  39. }
  40. private JToolBar createToolBar() {
  41. var openIcon = new ImageIcon("src/resources/document-open.png");
  42. var toolbar = new JToolBar();
  43. var openBtn = new JButton(openIcon);
  44. openBtn.addActionListener(new OpenFileAction());
  45. toolbar.add(openBtn);
  46. return toolbar;
  47. }
  48. private void createLayout(JComponent... arg) {
  49. var pane = getContentPane();
  50. var gl = new GroupLayout(pane);
  51. pane.setLayout(gl);
  52. gl.setHorizontalGroup(gl.createParallelGroup()
  53. .addComponent(arg[0], DEFAULT_SIZE, DEFAULT_SIZE,
  54. Short.MAX_VALUE)
  55. .addGroup(gl.createSequentialGroup()
  56. .addComponent(arg[1]))
  57. );
  58. gl.setVerticalGroup(gl.createSequentialGroup()
  59. .addComponent(arg[0])
  60. .addGap(4)
  61. .addComponent(arg[1])
  62. );
  63. pack();
  64. }
  65. public String readFile(File file) {
  66. String content = "";
  67. try {
  68. content = new String(Files.readAllBytes(Paths.get(
  69. file.getAbsolutePath())));
  70. } catch (IOException ex) {
  71. JOptionPane.showMessageDialog(this,
  72. "Could not read file", "Error", JOptionPane.ERROR_MESSAGE);
  73. }
  74. return content;
  75. }
  76. private class OpenFileAction extends AbstractAction {
  77. @Override
  78. public void actionPerformed(ActionEvent e) {
  79. var fileChooser = new JFileChooser();
  80. var filter = new FileNameExtensionFilter("Java files", "java");
  81. fileChooser.addChoosableFileFilter(filter);
  82. int ret = fileChooser.showDialog(panel, "Open file");
  83. if (ret == JFileChooser.APPROVE_OPTION) {
  84. var file = fileChooser.getSelectedFile();
  85. var text = readFile(file);
  86. area.setText(text);
  87. }
  88. }
  89. }
  90. public static void main(String[] args) {
  91. EventQueue.invokeLater(() -> {
  92. var ex = new FileChooserEx();
  93. ex.setVisible(true);
  94. });
  95. }
  96. }

该代码示例将演示如何使用JFileChooser将文件内容加载到文本区域组件中。

  1. var fileChooser = new JFileChooser();

这是文件选择器对话框的构造器。

  1. var filter = new FileNameExtensionFilter("Java files", "java");
  2. fileChooser.addChoosableFileFilter(filter);

在这里,我们定义文件过滤器。 在本例中,我们将具有扩展名为.java的 Java 文件。 我们还有默认的“所有文件”选项。

  1. int ret = fileChooser.showDialog(panel, "Open file");

showDialog()方法在屏幕上显示对话框。 单击“是”或“确定”按钮时,将返回JFileChooser.APPROVE_OPTION

  1. if (ret == JFileChooser.APPROVE_OPTION) {
  2. var file = fileChooser.getSelectedFile();
  3. var text = readFile(file);
  4. area.setText(text);
  5. }

在这里,我们获得所选文件的名称。 我们读取文件的内容并将文本设置到文本区域中。

Java Swing 对话框 - 图3

图:JFileChooser对话框

JColorChooser

JColorChooser是用于选择颜色的标准对话框。

ColorChooserEx.java

  1. package com.zetcode;
  2. import javax.swing.GroupLayout;
  3. import javax.swing.ImageIcon;
  4. import javax.swing.JButton;
  5. import javax.swing.JColorChooser;
  6. import javax.swing.JComponent;
  7. import javax.swing.JFrame;
  8. import javax.swing.JPanel;
  9. import javax.swing.JToolBar;
  10. import java.awt.Color;
  11. import java.awt.EventQueue;
  12. import static javax.swing.GroupLayout.DEFAULT_SIZE;
  13. public class ColorChooserEx extends JFrame {
  14. private JPanel colourPanel;
  15. public ColorChooserEx() {
  16. initUI();
  17. }
  18. private void initUI() {
  19. colourPanel = new JPanel();
  20. colourPanel.setBackground(Color.WHITE);
  21. var toolbar = createToolBar();
  22. createLayout(toolbar, colourPanel);
  23. setTitle("JColorChooser");
  24. setSize(400, 300);
  25. setLocationRelativeTo(null);
  26. setDefaultCloseOperation(EXIT_ON_CLOSE);
  27. }
  28. private JToolBar createToolBar() {
  29. var openIcon = new ImageIcon("src/resources/colourdlg.png");
  30. var toolbar = new JToolBar();
  31. var openBtn = new JButton(openIcon);
  32. openBtn.addActionListener(e -> {
  33. var color = JColorChooser.showDialog(colourPanel,
  34. "Choose colour", Color.white);
  35. colourPanel.setBackground(color);
  36. });
  37. toolbar.add(openBtn);
  38. return toolbar;
  39. }
  40. private void createLayout(JComponent... arg) {
  41. var pane = getContentPane();
  42. var gl = new GroupLayout(pane);
  43. pane.setLayout(gl);
  44. gl.setHorizontalGroup(gl.createParallelGroup()
  45. .addComponent(arg[0], DEFAULT_SIZE, DEFAULT_SIZE,
  46. Short.MAX_VALUE)
  47. .addGroup(gl.createSequentialGroup()
  48. .addGap(30)
  49. .addComponent(arg[1])
  50. .addGap(30))
  51. );
  52. gl.setVerticalGroup(gl.createSequentialGroup()
  53. .addComponent(arg[0])
  54. .addGap(30)
  55. .addComponent(arg[1])
  56. .addGap(30)
  57. );
  58. pack();
  59. }
  60. public static void main(String[] args) {
  61. EventQueue.invokeLater(() -> {
  62. var ex = new ColorChooserEx();
  63. ex.setVisible(true);
  64. });
  65. }
  66. }

在示例中,我们有一个白色面板。 我们将通过从JColorChooser中选择一种颜色来更改面板的背景颜色。

  1. var color = JColorChooser.showDialog(colourPanel,
  2. "Choose colour", Color.white);
  3. colourPanel.setBackground(color);

此代码显示颜色选择器对话框。 showDialog()方法返回所选的颜色值。 我们将colourPanel's背景更改为新选择的颜色。

在 Java Swing 教程的这一部分中,我们介绍了对话框。