




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十四章 GUI编程图形用户界面(Graphics user interface, GUI)是指用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令、启动操作,并将系统运行的结果以图形方式显示给用户的技术。由于用户界面设计质量的好坏直接影响软件的使用,Java语言对此也十分重视,几乎在JDK每个新的版本中,都增加了一定的GUI程序设计新技术或功能,Java语言的GUI发展始终保持着较好的连贯性和兼容性。目前Java主要提供了两个处理图形用户界面的类库:java.awt和javax.swing。 AWT:抽象窗口工具集(Abstract Windows Toolkit),由于Java代码可以在不同的系统平台运行,而不同平台的图形界面外观设计各有差异,所以Java程序的图形用户界面在不同的平台上可能出现不同的运行效果,其外观取决于具体的平台,所以称AWT是一个抽象的工具集。 Swing:Swing是在AWT的基础上构建的,提供了比标准AWT组件更强大和灵活的功能。与AWT组件不同的是,Swing组件不是由特定的平台代码实现,而是纯粹的Java代码,因此能够实现与平台的无关(此类组件一般被称为轻量级组件)。利用GUI类库设计和实现图形用户界面的工作主要有两个:一是应用的外观设计,即创建组成图形界面的各部件,指定其位置和属性关系,根据需要进行排列,从而构成完整的图形用户界面的物理外观;二是与用户的交互处理,包括定义图形用户界面的事件以及各部件对不同时间的响应处理。那现在开始就先讲AWT。AWT类包含在java.awt包中,主要包括用户界面组件、事件处理模型、图形和图像工具、布局管理器等。Java.awt包中的主要类及组件类的继承关系如图先来个最简单的例子1. publicclassTestPanel2. 3. publicstaticvoidmain(Stringargs)4. 5. Framef=newFrame(测试窗口);6. /创建一个Panel对象7. Panelp=newPanel();8. /相Panel对象中添加两个组件9. p.add(newTextField(20);10. p.add(newButton(单击我);11. f.add(p);12. /设置窗口的大小、位置13. f.setBounds(30,30,250,120);14. /将窗口显示出来(Frame对象默认处于隐藏状态)15. f.setVisible(true);16. 17. 然后我讲下布局管理器AWT中分为FlowLayoutBorderLayoutCardLayoutGridLayoutGridBagLayout这五种Swing的话再加上BoxLayout顺序布局(FlowLayout)是Panel容器的缺省布局策略,即将加入容器中的组件依次从左至右,从上至下排列,适用于组件个数较少的情况。1. publicclassTestFlowLayout2. 3. publicstaticvoidmain(Stringargs)4. 5. Framef=newFrame(测试窗口);6. /设置Frame容器使用FlowLayout布局管理器7. f.setLayout(newFlowLayout(FlowLayout.LEFT,20,5);8. /向窗口中添加10个按钮9. for(inti=0;i10;i+)10. 11. f.add(newButton(按钮+i);12. 13. /设置窗口为最佳大小14. f.pack();15. /将窗口显示出来(Frame对象默认处于隐藏状态)16. f.setVisible(true);17. 18. pack()方法非常有用,能讲窗口调整到最佳大小边界布局(BorderLayout)是Frame,Dialog,ScrollPane的缺省布局。区域布局将容器分为东西南北中五个区域,加入组件时,应通过字符串East/West /South/North/Center来标记组件的方位。1. publicclassTestBorderLayout2. 3. publicstaticvoidmain(Stringargs)4. 5. Framef=newFrame(测试窗口);6. /设置Frame容器使用BorderLayout布局管理器7. f.setLayout(newBorderLayout(30,5);8. f.add(newButton(南),BorderLayout.SOUTH);9. f.add(newButton(北),BorderLayout.NORTH);10. /默认添加到中间11. f.add(newButton(中);12. f.add(newButton(东),BorderLayout.EAST);13. f.add(newButton(西),BorderLayout.WEST);14. /设置窗口为最佳大小15. f.pack();16. /将窗口显示出来(Frame对象默认处于隐藏状态)17. f.setVisible(true);18. 19. 卡片布局(CardLayout)将容器中的每一个组件当作一个卡片,一次仅有一个卡片可见,最初显示容器时,加入到容器的第一个组件可见。1. publicclassTestCardLayout2. 3. Framef=newFrame(测试窗口);4. Stringnames=第一张,第二张,第三张,第四张,第五张;5. Panelpl=newPanel();6. CardLayoutc=newCardLayout();7. publicvoidinit()8. 9. pl.setLayout(c);10. for(inti=0;inames.length;i+)11. 12. pl.add(namesi,newButton(namesi);13. 14. Panelp=newPanel();15. /控制显示上一张的按钮16. Buttonprevious=newButton(上一张);17. previous.addActionListener(newActionListener()18. 19. publicvoidactionPerformed(ActionEvente)20. 21. c.previous(pl);22. 23. );24. /控制显示下一张的按钮25. Buttonnext=newButton(下一张);26. next.addActionListener(newActionListener()27. 28. publicvoidactionPerformed(ActionEvente)29. 30. c.next(pl);31. 32. );33. /控制显示第一张的按钮34. Buttonfirst=newButton(第一张);35. first.addActionListener(newActionListener()36. 37. publicvoidactionPerformed(ActionEvente)38. 39. c.first(pl);40. 41. );42. /控制显示最后一张的按钮43. Buttonlast=newButton(最后一张);44. last.addActionListener(newActionListener()45. 46. publicvoidactionPerformed(ActionEvente)47. 48. c.last(pl);49. 50. );51. /控制根据Card名显示的按钮52. Buttonthird=newButton(第三张);53. third.addActionListener(newActionListener()54. 55. publicvoidactionPerformed(ActionEvente)56. 57. c.show(pl,第三张);58. 59. );60. p.add(previous);61. p.add(next);62. p.add(first);63. p.add(last);64. p.add(third);65. f.add(pl);66. f.add(p,BorderLayout.SOUTH);67. f.pack();68. f.setVisible(true);69. 70. publicstaticvoidmain(Stringargs)71. 72. newTestCardLayout().init();73. 74. 75.网格布局(GridLayout)将容器划分为n*m的大小相同的小格,每格区间可摆放一个组件。向容器中增加组件时,按从左至右,从上至下的顺序依次存放.eg1. publicclassTestGridLayout2. 3. publicstaticvoidmain(Stringargs)4. 5. Framef=newFrame(计算器);6. Panelp1=newPanel();7. p1.add(newTextField(30);8. f.add(p1,BorderLayout.NORTH);9. Panelp2=newPanel();10. /设置Panel使用GridLayout布局管理器11. p2.setLayout(newGridLayout(3,5,4,4);12. Stringname=0,1,2,3,4,5,13. 6,7,8,9,+,-,*,/,.;14. /向Panel中依次添加15个按钮15. for(inti=0;iname.length;i+)16. 17. p2.add(newButton(namei);18. 19. f.add(p2);20. /设置窗口为最佳大小21. f.pack();22. /将窗口显示出来(Frame对象默认处于隐藏状态)23. f.setVisible(true);24. 25. 网格包布局(GridBagLayout)这个功能最强大,但用起来太麻烦了。将视图分为多个单元,可以指定每个组件占用的单元GridBagConstraints类-参数:gridx,gridy:组件的位置gridwidth,gridheight:组件覆盖的网格单元个数insets:组件和包含它的网格单元之间的距离weightx,weighty:视图大小变化时,组件的情况,标准为100,0为组件占用空间不变fill:填充方式,4种anchor:组件在网格单元中的位置,CENTER/NORTH/NORTHWEST。eg1. publicclassTestGridBag2. 3. privateFramef=newFrame(测试窗口);4. privateGridBagLayoutgb=newGridBagLayout();5. privateGridBagConstraintsgbc=newGridBagConstraints();6. privateButtonbs=newButton10;7. publicvoidinit()8. 9. f.setLayout(gb);10. for(inti=0;ibs.length;i+)11. 12. bsi=newButton(按钮+i);13. 14. /所有组件都可以横向、纵向上扩大15. gbc.fill=GridBagConstraints.BOTH;16. gbc.weightx=1;17. addButton(bs0);18. addButton(bs1);19. addButton(bs2);20. /该GridBagConstraints控制的GUI组件将会成为横向最后一个元素21. gbc.gridwidth=GridBagConstraints.REMAINDER;22. addButton(bs3);23. /该GridBagConstraints控制的GUI组件将横向上不会扩大24. gbc.weightx=0;25. addButton(bs4);26. /该GridBagConstraints控制的GUI组件将横跨2个网格27. gbc.gridwidth=2;28. addButton(bs5);29. /该GridBagConstraints控制的GUI组件将横跨1个网格30. gbc.gridwidth=1;31. /该GridBagConstraints控制的GUI组件将纵向跨2个网格32. gbc.gridheight=2;33. /该GridBagConstraints控制的GUI组件将会成为横向最后一个元素34. gbc.gridwidth=GridBagConstraints.REMAINDER;35. addButton(bs6);36. /该GridBagConstraints控制的GUI组件将横向跨越一个网格,纵向跨越2个网格。37. gbc.gridwidth=1;38. gbc.gridheight=2;39. /该GridBagConstraints控制的GUI组件纵向扩大的权重是140. gbc.weighty=1;41. addButton(bs7);42. /设置下面的按钮在纵向上不会扩大43. gbc.weighty=0;44. /该GridBagConstraints控制的GUI组件将会成为横向最后一个元素45. gbc.gridwidth=GridBagConstraints.REMAINDER;46. /该GridBagConstraints控制的GUI组件将纵向上横跨1个网格47. gbc.gridheight=1;48. addButton(bs8);49. addButton(bs9);50. f.pack();51. f.setVisible(true);52. 53. privatevoidaddButton(Buttonbutton)54. 55. gb.setConstraints(button,gbc);56. f.add(button);57. 58. publicstaticvoidmain(Stringargs)59. 60. newTestGridBag().init();61. 62. 63.盒子布局(BoxLayout)对GridBagLayout进行了简化,保留了它的优点。Box容器的默认布局管理就是它。它是通过横向或纵向放置器件。eg1. publicclassTestBoxSpace2. 3. privateFramef=newFrame(测试);4. /定义水平摆放组件的Box对象5. privateBoxhorizontal=Box.createHorizontalBox();6. /定义垂直摆放组件的Box对象7. privateBoxvertical=Box.createVerticalBox();8. publicvoidinit()9. 10. horizontal.add(newButton(水平按钮一);11. horizontal.add(Box.createHorizontalGlue();12. horizontal.add(newButton(水平按钮二);13. /水平方向不可拉伸的间距,其宽度为10px14. horizontal.add(Box.createHorizontalStrut(10);15. horizontal.add(newButton(水平按钮三);16. vertical.add(newButton(垂直按钮一);17. vertical.add(Box.createVerticalGlue();18. vertical.add(newButton(垂直按钮二);19. /垂直方向不可拉伸的间距,其高度为10px20. vertical.add(Box.createVerticalStrut(10);21. vertical.add(newButton(垂直按钮三);22. f.add(horizontal,BorderLayout.NORTH);23. f.add(vertical);24. f.pack();25. f.setVisible(true);26. 27. publicstaticvoidmain(Stringargs)28. 29. newTestBoxSpace().init();30. 31. GUI说起来多,其实用起来很方便。只是要怎么布局美观的问题,现在一般都用IDE插件拖动来完成这个工作,但学习下原理还是很有必要的,毕竟现在的插件动不动就卡住,有时所见非所得的情况很多。AWT提供的基本组件有以下几个,ButtonCanvasCheckboxCheckboxGroupChoiceFrameLabelListPanelScrollbarScrollPane(带滚动条的Panel)TextArea(多行文本域)TextField(单行文本域)这些没什么好说的,我举个例子就能说明一切,egpublic class CommonComponent Frame f = new Frame(测试); /定义一个按钮 Button ok = new Button(确认); CheckboxGroup cbg = new CheckboxGroup(); /定义一个单选框(处于cbg一组),初始处于被选中状态 Checkbox male = new Checkbox(男 , cbg , true); /定义一个单选框(处于cbg一组),初始处于没有选中状态 Checkbox female = new Checkbox(女 , cbg , false); /定义一个复选框,初始处于没有选中状态 Checkbox married = new Checkbox(是否已婚? , false); /定义一个下拉选择框 Choice colorChooser = new Choice(); /定义一个列表选择框 List colorList = new List(6, true); /定义一个5行、20列的多行文本域 TextArea ta = new TextArea(5, 20); /定义一个50列的单行文本域 TextField name = new TextField(50); public void init() colorChooser.add(红色); colorChooser.add(绿色); colorChooser.add(蓝色); colorList.add(红色); colorList.add(绿色); colorList.add(蓝色); /创建一个装载了文本框、按钮的Panel Panel bottom = new Panel(); bottom.add(name); bottom.add(ok); f.add(bottom , BorderLayout.SOUTH); /创建一个装载了下拉选择框、三个Checkbox的Panel Panel checkPanel = new Panel(); checkPanel.add(colorChooser); checkPanel.add(male); checkPanel.add(female); checkPanel.add(married); /创建一个垂直排列组件的Box,盛装多行文本域、Panel Box topLeft = Box.createVerticalBox(); topLeft.add(ta); topLeft.add(checkPanel); /创建一个垂直排列组件的Box,盛装topLeft、colorList Box top = Box.createHorizontalBox(); top.add(topLeft); top.add(colorList); /将top Box容器添加到窗口的中间 f.add(top); f.pack(); f.setVisible(true); public static void main(String args) new CommonComponent().init(); 然后讲下对话框,分为两种:模态对话框(打开时主对话框锁定)和非模态对话框(打开时主对话框可以激活)egpublic class TestDialog Frame f = new Frame(测试); Dialog d1 = new Dialog(f, 模式对话框 , true); Dialog d2 = new Dialog(f, 非模式对话框 , false); Button b1 = new Button(打开模式对话框); Button b2 = new Button(打开非模式对话框); public void init() d1.setBounds(20 , 30 , 300, 400); d2.setBounds(20 , 30 , 300, 400); b1.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) d1.setVisible(true); ); b2.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) d2.setVisible(true); ); f.add(b1); f.add(b2 , BorderLayout.SOUTH); f.pack(); f.setVisible(true); public static void main(String args) new TestDialog().init(); 文件对话框,egpublic class TestFileDialog Frame f = new Frame(测试); FileDialog d1 = new FileDialog(f, 选择需要打开文件 , FileDialog.LOAD); FileDialog d2 = new FileDialog(f, 选择保存文件的路径 , FileDialog.SAVE); Button b1 = new Button(打开文件); Button b2 = new Button(保存文件); public void init() b1.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) d1.setVisible(true); System.out.println(d1.getDirectory() + d1.getFile(); ); b2.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) d2.setVisible(true); System.out.println(d2.getDirectory() + d2.getFile(); ); f.add(b1); f.add(b2 , BorderLayout.SOUTH); f.pack(); f.setVisible(true); public static void main(String args) new TestFileDialog().init(); AWT菜单由以下几个部分组成:MenuBarMenuPopupMenuMenuItemCheckboxMenuItemMenuShortcut这些都可以顾名思义,当要记住一个菜单的分隔线的使用 new MenuItem(-),这里举个例子让大家来了解下,egpublic class SimpleMenu private Frame f = new Frame(测试); private MenuBar mb = new MenuBar(); Menu file = new Menu(文件); Menu edit = new Menu(编辑); MenuItem newItem = new MenuItem(新建); MenuItem saveItem = new MenuItem(保存); /创建exitItem菜单项,指定使用 Ctrl+X 快捷键 MenuItem exitItem = new MenuItem(退出 , new MenuShortcut(KeyEvent.VK_X); CheckboxMenuItem autoWrap = new CheckboxMenuItem(自动换行); MenuItem copyItem = new MenuItem(复制); MenuItem pasteItem = new MenuItem(粘贴); Menu format = new Menu(格式); /创建commentItem菜单项,指定使用 Ctrl+Shift+/ 快捷键 MenuItem commentItem = new MenuItem(注释 , new MenuShortcut(KeyEvent.VK_SLASH , true); MenuItem cancelItem = new MenuItem(取消注释); private TextArea ta = new TextArea(6 , 40); public void init() /以匿名内部类的形式创建菜单监听器 ActionListener menuListener = new ActionListener() public void actionPerformed(ActionEvent e) String cmd = e.getActionCommand(); ta.append(单击“ + cmd + ”菜单 + n); if (cmd.equals(退出) System.exit(0); ; /为commentItem、exitItem两个菜单项添加了事件监听器。 commentItem.addActionListener(menuListener); exitItem.addActionListener(menuListener); /为file菜单添加菜单项 file.add(newItem); file.add(saveItem); file.add(exitItem); /为edit菜单添加菜单项 edit.add(autoWrap); /使用addSeparator方法来添加菜单分隔线 edit.addSeparator(); edit.add(copyItem); edit.add(pasteItem); /为format菜单添加菜单项 format.add(commentItem); format.add(cancelItem); /使用添加new MenuItem(-)的方式添加菜单分隔线 edit.add(new MenuItem(-); /将format菜单组合到edit菜单中,从而形成二级菜单 edit.add(format); /将file、edit菜单添加到mb菜单条中 mb.add(file); mb.add(edit); /为f窗口设置菜单条 f.setMenuBar(mb); /以匿名内部类的形式来创建事件监听器对象 f.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) ta.append(用户试图关闭窗口!n); System.exit(0); ); f.add(ta); f.pack(); f.setVisible(true); public static void main(String args) new SimpleMenu().init(); 右键菜单public class TestPopupMenu private TextArea ta = new TextArea(4 , 30); private Frame f = new Frame(测试); PopupMenu pop = new PopupMenu(); CheckboxMenuItem autoWrap = new CheckboxMenuItem(自动换行); MenuItem copyItem = new MenuItem(复制); MenuItem pasteItem = new MenuItem(粘贴); Menu format = new Menu(格式); /创建commentItem菜单项,指定使用 Ctrl+Shift+/ 快捷键 MenuItem commentItem = new MenuItem(注释 , new MenuShortcut(KeyEvent.VK_SLASH , true); MenuItem cancelItem = new MenuItem(取消注释); public void init() /以匿名内部类的形式创建菜单监听器 ActionListener menuListener = new ActionListener() public void actionPerformed(ActionEvent e) String cmd = e.getActionCommand(); ta.append(单击“ + cmd + ”菜单 + n); if (cmd.equals(退出) System.exit(0); ; /为commentItem、exitItem两个菜单项添加了事件监听器。 commentItem.addActionListener(menuListener); /为pop菜单添加菜单项 pop.add(autoWrap); /使用addSeparator方法来添加菜单分隔线 pop.addSeparator(); pop.add(copyItem); pop.add(pasteItem); /为format菜单添加菜单项 format.add(commentItem); format.add(cancelItem); /使用添加new MenuItem(-)的方式添加菜单分隔线 pop.add(new MenuItem(-); /将format菜单组合到pop菜单中,从而形成二级菜单 pop.add(format); final Panel p = new Panel(); p.setPreferredSize(new Dimension(300, 160); /向p窗口中添加PopupMenu对象 p.add(pop); p.addMouseListener(new MouseAdapter() public void mouseReleased(MouseEvent e) if (e.isPopupTrigger() pop.show(p , e.getX() , e.getY(); ); f.add(p); f.add(ta , BorderLayout.NORTH); /以匿名内部类的形式来创建事件监听器对象 f.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) ta.append(用户试图关闭窗口!n); System.exit(0); ); f.pack(); f.setVisible(true); public static void main(String args) new TestPopupMenu().init(); 但是遗憾的是AWT不支持带有图标的菜单,如要使用请用Swing来解决。 Java语言将每一个键盘或鼠标的操作定义为一个“事件”。在编程中只需定义每个特定事件发生时程序应该做出何种响应即可。这就是图形用户界面中的“事件”和“事件响应”。事件处理的原理其实很简单,当程序启动时awt起个线程监听键盘,鼠标等的事件,当发生时产生个事件源,事件监听器负责监听事件,然后得到Event对象,然后根据Event对象来自己处理不同的事件。下面看个最简单的事件处理,eg public class EventQs private Frame f = new Frame(测试事件); private Button ok = n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国考审计署特派办申论公文写作高频考点及答案
- 钢结构现场测量与定位技术方案
- 2025国考承德市海洋管理岗位申论模拟题及答案
- 车用消费品中VOCs的排放清单及其对环境与人体健康影响的研究
- 家家悦连续并购背后的商誉减值问题研究
- 隧道通风系统建设方案
- 中青年2型糖尿病视网膜病变风险预测模型的构建及验证
- 2025国考无锡市法制审核岗位申论必刷题及答案
- 2025国考吉林市科研技术岗位申论预测卷及答案
- 2025国考大连市档案管理岗位行测必刷题及答案
- 2025年银行从业资格考试公共基础真题及答案
- 2025年辅警考试真题及答案
- 2025-2026学年统编版五年级上册语文第二单元过关试卷附答案(三套)
- 2025年上海公务员录用考试《行测》真题及答案解析(记忆版)
- 2025年农村土地租赁协议(合同样本)
- 铁路礼仪培训课件
- 海上安全培训课课件
- 神经外科重症管理临床指南
- 铁路客运防寒过冬课件
- 2025至2030中国生物保健品行业项目调研及市场前景预测评估报告
- 急性肺栓塞诊断和治疗指南(2025版)解读
评论
0/150
提交评论