十六. 图形用户界面 GUI CLIGUI(Graphical User Interface)图形用户接口用图形的方式来显示计算机操作的界面更方便更直观CLI(Command Line User Interface)命令行用户接口就是常见的Dos命令行操作需要记忆常用的命令操作不直观GUI核心框架AWT抽象窗口工具包(Abstract Window ToolKit)特点‌Java 最早的 GUI 库直接调用操作系统原生组件属重量级控件缺点‌界面风格依赖本地系统在 Windows 和 Mac 上长得不一样跨平台兼容性差组件功能较少适用‌仅适合极简单的工具或资源受限的嵌入式场景新项目基本不再选用Swing主流选择特点‌基于 AWT 改进组件完全由 Java 代码绘制不依赖本地系统。增强了移植性属轻量级控件优势‌界面风格在所有平台上完全统一组件库非常丰富表格、树形图等生态成熟稳定适用‌大多数企业级桌面应用、内部管理系统目前仍有大量存量项目在使用JavaFX现代趋势‌特点‌独立的渲染引擎支持 CSS 样式、FXML 布局文件和硬件加速优势‌界面更美观现代支持动画、3D 渲染和 Web 嵌入适合对用户体验要求高的商业软件适用‌需要炫酷界面、多媒体交互或跨桌面与移动端部署的新项目AWT容器 组件Container容器特殊的组件。可通过add()添加其他组件Frame窗体Dialog对话框依赖窗体FileDialogComponent组件MenuBar菜单栏Menu菜单MenuItem菜单项Button按钮Label标签CheckBoxTextComponentTextField TextArea布局管理器组件的排放方式就是布局分类FlowLayout流式从左到右。Panel默认的布局管理器BorderLayout边界东南西北中。Frame默认的布局管理器GridLayout网格规则的矩阵CardLayout卡片选项卡GridBagLayout网格包非规则的矩阵事件监听机制2.有监听器所监听的动作作于事件源上3.产生事件对象4.将事件对象传给事件处理方式1.将监听器注册到事件源外部动作事件源组件事件对象监听器监听引发事件的动作事件处理方式特点事件源AWT包或Swing包中的那些图形界面组件事件每个事件源都有自己特有的对应事件和共性事件监听器将可以触发某一事件的动作都已经封装到了监听器中不止一个动作事件处理我们要做的事情就是对产生的动作进行处理注事件源、事件、监听器在Java中已经定义好了直接获取对象用就可以监听器 适配器WindowListener接口有7个抽象方法要实现这个接口需复写所有方法子类WindowAdapter适配器抽象类覆盖了该接口的所有方法因为方法体为空所以该类是抽象类监听器中的方法 ≥ 3个基本都有对应的适配器适配器的目的是方便创建监听器对象只覆盖需要的ActionListener监听器没有适配器只有1个方法实例Frame// 1.创建FrameframenewFrame(GUI Demo Frame);// 创建一个窗口对象名为GUI Demo Frame// 2.基本设置frame.setSize(500,400);// 窗体大小为500x400frame.setLocation(300,200);// 窗体位置为(300, 200)以屏幕左上角为起点// frame.setBounds(300, 200, 500, 400); // 窗体位置和大小x,y,width,heightframe.setLayout(newFlowLayout());// 设置窗体布局为流式布局// 3.定义组件ButtonbutnewButton(Click Me!);// 4.添加组件到窗体frame.add(but);// 5.设置窗体可见(默认不可见)frame.setVisible(true);WindowListenerframe.addWindowListener(newWindowAdapter(){OverridepublicvoidwindowClosing(WindowEvente){System.exit(0);// 关闭}OverridepublicvoidwindowActivated(WindowEvente){System.out.println(Window Activated);// 窗体激活}OverridepublicvoidwindowOpened(WindowEvente){System.out.println(Window Opened);// 窗体打开}});DialogDialogdialognewDialog(frame,提示信息,true);// true表示模态对话框只能在对话框关闭前关闭主窗口LabellabelnewLabel();ButtonbuttonnewButton(OK);dialog.add(label);dialog.add(button);dialog.setBounds(400,300,400,300);dialog.setLayout(newFlowLayout());label.setText(Tip);label.setSize(300,200);// dialog.setVisible(true);button.addActionListener(newActionListener(){OverridepublicvoidactionPerformed(ActionEvente){System.out.println(确定按钮被点击);dialog.dispose();// 关闭对话框}});ActionListener MouseListener先mouseClicked再actionPerformedbut.addActionListener(newActionListener(){OverridepublicvoidactionPerformed(ActionEvente){System.out.println(Button Clicked!);// 按钮点击dialog.setVisible(true);// 显示对话框}});but.addMouseListener(newMouseAdapter(){OverridepublicvoidmouseEntered(MouseEvente){System.out.println(Mouse Entered!);// 鼠标进入}OverridepublicvoidmouseClicked(MouseEvente){System.out.println(Mouse Clicked!);// 鼠标点击System.out.println(e.getClickCount());// 鼠标点击次数}});KeyListenerbut.addKeyListener(newKeyAdapter(){OverridepublicvoidkeyPressed(KeyEvente){System.out.println(Key Pressed!);// 键盘按下System.out.println(e.getKeyChar());// 键码对应的字符System.out.println(e.getKeyCode());// 键码System.out.println(KeyEvent.getKeyText(e.getKeyCode()));// 键名System.out.println(KeyEvent.VK_ENTER);// 回车键System.out.println(e.isControlDown());// 是否按下Ctrl键}});TextField TextAreaTextFieldtfnewTextField(20);// 创建一个文本框宽度为20tf.addKeyListener(newKeyAdapter(){OverridepublicvoidkeyTyped(KeyEvente){System.out.println(Key Typed!);charce.getKeyChar();// 键码对应的字符if(!Character.isDigit(c)){e.consume();// 消耗事件阻止文本框输入非数字字符}}});System.out.println(tf.getText());// tf.setText(Hello, World!); // 设置文本框内容frame.add(tf);TextAreatanewTextArea(10,40);// 创建一个文本区域行数为10列数为40ta.setText(文本);// 设置文本ta.append(追加);// 追加文本frame.add(ta);MenuBar Menu MenuItemMenuBarmenuBarnewMenuBar();MenumenunewMenu(Menu);MenuItemitemnewMenuItem(exit);menu.add(item);menuBar.add(menu);frame.setMenuBar(menuBar);MenuItemsubOpenItemnewMenuItem(open);MenuItemsubSaveItemnewMenuItem(save);MenusubMenunewMenu(sub menu);menu.add(subMenu);subMenu.add(subOpenItem);subMenu.add(subSaveItem);item.addActionListener(newActionListener(){OverridepublicvoidactionPerformed(ActionEvente){System.out.println(退出菜单项被点击);System.exit(0);}});FileDialogFileDialogopenDialognewFileDialog(frame,打开,FileDialog.LOAD);FileDialogsaveDialognewFileDialog(frame,保存,FileDialog.SAVE);/** * 通过判断路径/文件名是否为null可以判断用户是否点击了“打开”或“保存”按钮 * 如果路径/文件名不为null则用户点击了“打开”或“保存”按钮 * 如果路径/文件名为null则用户点击了“取消”按钮 */subOpenItem.addActionListener(newActionListener(){OverridepublicvoidactionPerformed(ActionEvente){System.out.println(打开菜单项被点击);openDialog.setVisible(true);System.out.println(open DirectoryopenDialog.getDirectory());// 路径System.out.println(open FileopenDialog.getFile());// 文件名}});subSaveItem.addActionListener(newActionListener(){OverridepublicvoidactionPerformed(ActionEvente){System.out.println(保存菜单项被点击);saveDialog.setVisible(true);System.out.println(save DirectorysaveDialog.getDirectory());// 路径System.out.println(save FilesaveDialog.getFile());// 文件名}});