1、Java GUI 概述
GUI(Graphical User Interface,简称 GUI,图形用户界面)是指采用图形方式显示的计算机操作用户界面,与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。
Java GUI主要有两个核心库,分别是AWT(java.awt:Abstract Windows ToolKit(抽象窗口工具包))和Swing(javax.swing:AWT的扩展),AWT需要调用本地系统方法来实现功能,属重量级控件,而Swing是在AWT的基础上,建立的一套图像界面系统,其中提供了更多的组件,而且完全由Java实现,增强了移植性,属轻量级组件。
2、容器
容器(Container)是组件(Component)的子类,一个容器可以容纳多个组件,并使他们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面,所有的组件都可以通过add()方法加入容器中。容器共有四种类型,分别是窗口(JFrame)、弹窗(JDialog)、面板(JPanel)、滚动面板(JScrollPanel)。
2、1 窗口
Frame或JFrame类用于创建一个具有标题栏的框架窗口作为程序的主要界面,它不依赖其他容器可以单独存在。
public class JFrameUse { public static void main(String[] args) { // 初始化窗口 JFrame jFrame = new JFrame("这个是窗口的标题"); // 设置窗口的位置和大小 jFrame.setBounds(400, 300, 500, 500); // 设置窗口的背景颜色 jFrame.setBackground(new Color(175, 114, 114)); // 设置窗口是否可见 jFrame.setVisible(true); // 设置窗口是否可以缩放 jFrame.setResizable(false); /** * 设置窗口的相对位置。 * 如果 comp 整个显示区域在屏幕内, 则将窗口放置到 comp 的中心; * 如果 comp 显示区域有部分不在屏幕内, 则将该窗口放置在最接近 comp 中心的一侧; * comp 为 null, 表示将窗口放置到屏幕中心。 */ jFrame.setLocationRelativeTo(null); /** * 设置窗口关闭按钮点击后的默认操作, 参考值: * WindowConstants.DO_NOTHING_ON_CLOSE: 不执行任何操作。 * WindowConstants.HIDE_ON_CLOSE: 隐藏窗口(不会结束进程), 再次调用 setVisible(true) 将再次显示。 * WindowConstants.DISPOSE_ON_CLOSE: 销毁窗口, 如果所有可显示的窗口都被 DISPOSE, 则可能会自动结束进程。 * WindowConstants.EXIT_ON_CLOSE: 退出进程。 */ jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } }
2、2 弹窗和对话框
JDialog,对话框,使用 JDialog 类可以创建自定义有的对话框,或者调用 JOptionPane 中的多个静态方法快速创建各种标准的对话框。
JOptionPane是JavaSwing内部已实现好的,以静态方法的形式提供调用,能够快速方便的弹出要求用户提供值或向其发出通知的标准对话框。主要具有以下几种那类型:
- showMessageDialog:消息对话框,向用户展示一个消息,没有返回值。
- showConfirmDialog:确认对话框,询问一个问题是否执行。
- showInputDialog:输入对话框,要求用户提供某些输入。
- showOptionDialog:选项对话框,上述三项的大统一,自定义按钮文本,询问用户需要点击哪个按钮。
上述四个类型的方法(包括其若干重载)的参数遵循一致的模式,下面介绍各参数的含义:
- parentComponent: 对话框的父级组件,决定对话框显示的位置,对话框的显示会尽量紧靠组件的中心,如果传 null,则显示在屏幕的中心。
- title: 对话框标题。
- message: 消息内容。
- optionType: 选项按钮的类型。
- selectionValues、initialSelectionValue: 提供的输入选项,以及默认选中的选项。
- icon: 自定义的对话框图标,如果传 null,则图标类型由 messageType 决定。
- messageType: 消息类型,主要是提供默认的对话框图标。可能的值为:
- JOptionPane.PLAIN_MESSAGE 简单消息(不使用图标)
- JOptionPane.INFORMATION_MESSAGE 信息消息(默认)
- JOptionPane.QUESTION_MESSAGE 问题消息
- JOptionPane.WARNING_MESSAGE 警告消息
- JOptionPane.ERROR_MESSAGE 错误消息
对话框
class JOptionPaneUse { public JOptionPaneUse() { final JFrame jf = new JFrame("测试窗口"); jf.setSize(400, 400); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); /* * 1. 消息对话框(信息消息) */ JButton btn01 = new JButton("showMessageDialog(信息消息)"); btn01.addActionListener(e -> { // 消息对话框无返回, 仅做通知作用 JOptionPane.showMessageDialog(jf, "通知信息", "消息标题", JOptionPane.INFORMATION_MESSAGE ); }); /* * 2. 消息对话框(警告消息) */ JButton btn02 = new JButton("showMessageDialog(警告消息)"); btn02.addActionListener(e -> { // 消息对话框无返回, 仅做通知作用 JOptionPane.showMessageDialog(jf, "警告信息", "消息标题", JOptionPane.WARNING_MESSAGE); }); /* * 3. 确认对话框 */ JButton btn03 = new JButton("showConfirmDialog"); btn03.addActionListener(e -> { /* * 返回用户点击的选项, 值为下面三者之一: * 是: JOptionPane.YES_OPTION * 否: JOptionPane.NO_OPTION * 取消: JOptionPane.CANCEL_OPTION * 关闭: JOptionPane.CLOSED_OPTION */ int result = JOptionPane.showConfirmDialog(jf, "确认删除?", "提示", JOptionPane.YES_NO_CANCEL_OPTION); System.out.println("选择结果: " + result); }); /* * 4. 输入对话框(文本框输入) */ JButton btn04 = new JButton("showInputDialog(文本框输入)"); btn04.addActionListener(e -> { // 显示输入对话框, 返回输入的内容 String inputContent = JOptionPane.showInputDialog(jf, "输入你的名字:", "默认内容"); System.out.println("输入的内容: " + inputContent); }); /* * 5. 输入对话框(下拉框选择) */ JButton btn05 = new JButton("showInputDialog(下拉框选择)"); btn05.addActionListener(e -> { Object[] selectionValues = new Object[]{"香蕉", "雪梨", "苹果"}; // 显示输入对话框, 返回选择的内容, 点击取消或关闭, 则返回null Object inputContent = JOptionPane.showInputDialog(jf, "选择一项: ", "标题", JOptionPane.PLAIN_MESSAGE, null, selectionValues, selectionValues[0]); System.out.println("输入的内容: " + inputContent); }); /* * 6. 选项对话框 */ JButton btn06 = new JButton("showOptionDialog"); btn06.addActionListener(e -> { // 选项按钮 Object[] options = new Object[]{"香蕉", "雪梨", "苹果"}; // 显示选项对话框, 返回选择的选项索引, 点击关闭按钮返回-1 int optionSelected = JOptionPane.showOptionDialog(jf, "请点击一个按钮选择一项", "对话框标题", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, options, // 如果传null, 则按钮为 optionType 类型所表示的按钮(也就是确认对话框) options[0] ); if (optionSelected >= 0) { System.out.println("点击的按钮: " + options[optionSelected]); } }); // 垂直排列按钮 Box vBox = Box.createVerticalBox(); vBox.add(btn01); vBox.add(btn02); vBox.add(btn03); vBox.add(btn04); vBox.add(btn05); vBox.add(btn06); JPanel panel = new JPanel(); panel.add(vBox); jf.setContentPane(panel); jf.setVisible(true); } }
自定义弹窗
class JDialogUse { public JDialogUse() { final JFrame jf = new JFrame("测试窗口"); jf.setSize(300, 300); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JButton btn = new JButton("显示自定义对话框"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { showCustomDialog(jf, jf); } }); JPanel panel = new JPanel(); panel.add(btn); jf.setContentPane(panel); jf.setVisible(true); } /** * 显示一个自定义的对话框 * * @param owner 对话框的拥有者 * @param parentComponent 对话框的父级组件 */ private static void showCustomDialog(Frame owner, Component parentComponent) { // 创建一个模态对话框 final JDialog dialog = new JDialog(owner, "提示", true); // 设置对话框的宽高 dialog.setSize(250, 150); // 设置对话框大小不可改变 dialog.setResizable(false); // 设置对话框相对显示的位置 dialog.setLocationRelativeTo(parentComponent); // 创建一个标签显示消息内容 JLabel messageLabel = new JLabel("对话框消息内容"); // 创建一个按钮用于关闭对话框 JButton okBtn =