1、第四章 JAVA的GUI程序设计主要内容oGUI基础oGUI绘图o事件驱动的程序设计o创建GUIoApplet和多媒体GUI基础GUI类o窗口(Window)o按钮(Button)o标签(Label)o文本框(Textbox)o复选框(Check Box)o单选框(Radio Button)o组合框(Combol Box)o菜单(Menu)o工具栏(Tool Bar)o状态栏(Statue Bar)o滚动条(Scroll Bar)oGUI包oAWT(Abstract Window Toolkit)nJAVA1.1之前的GUI组件包n依赖于操作系统,调用操作系统的API绘制n位于java.awt
2、包及其子包中oSwingnJAVA1.2之后的GUI组件包,用于替代AWTn不依赖于操作系统,而是直接由虚拟机绘制n位于javax.swing包及其子包中GUI包oSWT(Standard Widget Toolkit)nIBM公司开发的GUI组件包n直接调用操作系统的GUI组件,如果操作系统没有该组件,则由虚拟机绘制n位于org.eclipse.swt包及其子包中GUI类的继承体系 Dimension Font FontMetrics Component GraphicsObject Color Container Panel Applet Frame Dialog Window JComp
3、onentJApplet JFrame JDialog javax.swing包包 java.awt 包包 1 LayoutManager *GUI类的继承体系 JMenuItem JCheckBoxMenuItem AbstractButton JComponent JMenu JRadioButtonMenuItem JToggleButton JCheckBox JRadioButton JComboBox JInternalFrame JLayeredPane JList JMenuBar JOptionPane JPopupMenu JProgressBar JFileChooser
4、 JScrollBar JScrollPane JSeparator JSplitPane JSlider JTabbedPane JTable JTableHeader JTextField JTextComponent JTextArea JToolBar JToolTip JTree JRootPane JPanel JPasswordField JColorChooser JLabel JEditorPane JSpinner JButton Javax.swingJavax.swing包中的包中的GUIGUI类大多以类大多以J J开头!开头!GUI类:控件 JMenuItem JCh
5、eckBoxMenuItem AbstractButton JComponent JMenu JRadioButtonMenuItem JToggleButton JCheckBox JRadioButton JComboBox JInternalFrame JLayeredPane JList JMenuBar JOptionPane JPopupMenu JProgressBar JFileChooser JScrollBar JScrollPane JSeparator JSplitPane JSlider JTabbedPane JTable JTableHeader JTextFie
6、ld JTextComponent JTextArea JToolBar JToolTip JTree JRootPane JPanel JPasswordField JColorChooser JLabel JEditorPane JSpinner JButton GUI类:容器Dimension Font FontMetrics Component Graphics Object Color Container Panel Applet Frame Dialog Window JComponent JApplet JFrame JDialog javax.swing 包包 java.awt
7、 包包 1 LayoutManager *JPanel 容器类用于存放容器类用于存放其它其它GUIGUI组件类!组件类!GUI类:辅助Dimension Font FontMetrics Graphics Object Color Container Panel Applet Frame Dialog Window JComponent JApplet JFrame JDialog javax.swing 包包 java.awt 包包 1 LayoutManager *JPanel Component辅助类用于描述辅助类用于描述GUIGUI组件组件和容器的属性(如画布、和容器的属性(如画布、字
8、体、颜色等)!字体、颜色等)!javax.swing.JFrame类oJFrame类用于创建窗口javax.swing.JFrame+JFrame()+JFrame(String title)+setSize(int width,int height)+setVisible(boolean visible)+setDefaultCloseOperation(int mode)+setLocationRelativeTo(Component c)创建没有标题的窗口创建没有标题的窗口创建标题为创建标题为title的窗口的窗口设置窗口的尺寸设置窗口的尺寸设置窗口是否可见设置窗口是否可见设置关闭窗口时
9、的操作设置关闭窗口时的操作设置窗口相对于组件设置窗口相对于组件c的位置,的位置,如果如果c为为null,窗口在屏幕上居,窗口在屏幕上居中显示中显示javax.swing.JFrame类o创建窗口import javax.swing.*;public class MyFrame public static void main(String args)JFrame frame=new JFrame(Test Frame);frame.setSize(400,300);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_
10、ON_CLOSE);默认情况下,点击窗口右上角的关闭默认情况下,点击窗口右上角的关闭按钮时,窗口隐藏。按钮时,窗口隐藏。javax.swing.JFrame类o添加GUI组件nadd(JComponent c)方法import javax.swing.*;public class MyFrame public static void main(String args)JFrame frame=new JFrame(Test Frame);frame.setSize(400,300);frame.add(new JButton(“hello swing”);frame.setVisible(tr
11、ue);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);布局管理器o布局n是指GUI组件在GUI容器中如何排列放置的。o布局管理器n即GUI容器中用于布局GUI组件的类。nJAVA支持多种布局管理器,如:oFlowLayout、GridLayout、BorderLayouto设置布局管理器。nGUI容器类.setLayout(LayoutManager)java.awt.FlowLayout类oFlowLayout的布局机制n从左到右将GUI组件排列在GUI容器中,放满一行,就开始新的一行。java.awt.FlowLayout-ali
12、gnment:int-hgap:int-vgap:int+FlowLayout()+FlowLayout(int alignment)+FlowLayout(int alignment,int hgap,int vgap)设置设置GUI组件的对齐方式,默认组件的对齐方式,默认CENTER设置设置GUI组件之间的横向与纵向间距组件之间的横向与纵向间距java.awt.FlowLayout类o例如:通常通过继承通常通过继承JFrame的的方法,创建新窗口类。方法,创建新窗口类。java.awt.FlowLayout类o通过继承JFrame类,创建新窗口类。n有利于新窗口类的复用(reusable)
13、。java.awt.GridLayout类oGridLayout的布局机制n根据规定的行数和列数,逐行逐列放置GUI组件java.awt.GridLayout-rows:int-columns:int-hgap:int-vgap:int+GridLayout()+GridLayout(int rows,int columns)+GridLayout(int rows,int columns,int hgap,int vgap)java.awt.GridLayout类o例如:java.awt.GridLayout类o说明:n行数和列数可以为0,但不能同时为0。n如果行(列)数为0,则根据列(行)
14、数动态计算行(列)数。java.awt.GridLayout类o说明n如果行数列数都不为0,则行作为主要参数。o例如:java.awt.GridLayout类o说明nGridLayout容器中,所有GUI组件的大小都一样。java.awt.GridLayout类o说明n代码中GUI组件添加到窗口的顺序,决定了该GUI组件在窗口中的排放次序。FlowLayout也是如此。java.awt.BorderLayout类oBorderLayout的布局机制n将窗口分为东、南、西、北和中央五个区域,使用add(Component,index)方法将GUI组件添加到特定区域中。(index表示GUI组件放
15、置的区域)java.awt.BorderLayout-hgap:int-vgap:int+BorderLayout()+BorderLayout(int hgap,int vgap)各区域间的水平各区域间的水平和垂直间距和垂直间距java.awt.BorderLayout类o例如:用用add()方法将方法将GUI组件添加到组件添加到中央区域时,可以省略中央区域时,可以省略index参参数。数。java.awt.BorderLayout类o说明:n如果东、南、西、北任一区域没有放置GUI组件,则中央区域延伸至该区域。java.awt.BorderLayout类o说明nBorderLayout是J
16、Frame类的默认布局管理器。复杂GUI布局的创建o使用java.swing.JPanel类作为窗口的子容器JPanelJTextFieldJButtonJPanel复杂GUI布局的创建ojava.swing.JPanel类n构造方法opublic JPanel()n设置布局管理器oJPanel.setLayout(布局管理器类)nJPanel类中添加GUI组件oJPanel.add(JComponent c);JPanel中也可以添加中也可以添加其他其他JPanel实例。实例。复杂GUI布局的创建o实例:n微波炉界面java.awt.Color类o构造方法npublic Color(int
17、r,int g,int b)o(0 r,g,b 255)o十三种颜色常量nColor.REDnColor.BLACKnColor.WHITEnjava.awt.Color类o设置GUI组件的颜色:java.awt.Font类o构造方法npublic Font(String name,int style,int size)o例如:Font font1=new Font(“宋体宋体”,Font.Bold,16);Font font2=new Font(“隶书隶书”,Font.Bold+Font.Italic,20);java.awt.Font类o设置GUI组件的字体SwingGUI组件的一般特性
18、java.awt.Container+add(comp:Component):Component+add(comp:Component,index:int):Component+remove(comp:Component):void+getLayout():LayoutManager+setLayout(l:LayoutManager):void+paintComponents(g:Graphics):void javax.swing.JComponent-toolTipText:String -border:javax.swing.border.Border java.awt.Compone
19、nt-font:java.awt.Font -background:java.awt.Color-foreground:java.awt.Color-preferredSize:Dimension -visible:boolean +get Width():int+getHeight():int +getX():int +getY():int SwingGUI组件的一般特性o程序实例:nP330程序清单12-7上机oP336编程练习n12.1n12.2n12.3n12.4n12.7GUI绘图坐标oGUI容器/组件左上角为(0,0)n向右为x轴正方向,向下为y轴正方向(0,0)X Axis Y
20、Axis(x,y)x y Java Coordinate System X Axis Conventional Coordinate System(0,0)Y Axis 坐标o获取GUI组件c在其容器中的左上角坐标nc.getX()nc.getY()Graphics类o位于java.awt包中oGraphics是用于在GUI组件上绘制图形的类。o获取GUI组件的GraphicsngetGraphics()方法n例如:oJButton.getGraphics()oJLable.getGraphics()调用调用getGraphics()方法时,方法时,必须确保必须确保GUI组件组件visiabl
21、e=true,否则返回,否则返回null。Graphics类opaintComponent()方法n在GUI组件首次显示或需要重新显示的时候JVM自动调用,不需要用户自己调用n绘制图形的代码应该放在paintComponent()方法中protected void paintComponent(Graphics g)super.paintComponent(g);g.drawLine(0,0,50,50);作为第一句调用,用作为第一句调用,用于清除原有的图形。于清除原有的图形。Graphics类orepaint()方法n调用repaint方法时,将调用paintComponent方法,实现GU
22、I组件的重绘在JPanel上绘图o通常使用JPanel类绘图绘制字符串、直线、矩形、椭圆odrawString(String s,int x,int y)odrawLine(int x1,int y1,int y1,int y2)odrawRect(int x,int y,int w,int h)ofillRect(int x,int y,int w,int h)odrawOval(int x,int y,int w,int h)ofillOval(int x,int y,int w,int h)绘制弧形odrawArc(int x,int y,int w,int h,int startAng
23、le,int arcAngle)ofillArc(int x,int y,int w,int h,int startAngle,int arcAngle)实例学习:FigurePanel类事件驱动的程序设计事件和事件源o事件(event)n事件是指程序发生了某些事情的信号。n例如:o外部事件:点击鼠标、敲击键盘、点击按钮o内部事件:数据被更改、到达某个时间o源对象n事件源是指在其上触发事件的GUI组件。事件类的继承体系javax.swing.event包包java.awt.event包包用户行为、源对象和事件类型用户行为用户行为 源对象源对象事件类型事件类型点击按钮JButtonActionE
24、vent点击复选框JCheckBoxItemEvent,ActionEvent点击单选按钮JRadioButtonItemEvent,ActionEvent在文本框中点击回车JTextFieldActionEvent选定一个新项目JComboBoxItemEvent,ActionEvent窗口打开、关闭WindowWindowEvent 鼠标动作.ComponentMouseEvent 键盘动作 ComponentKeyEvent 事件的监听、注册和处理o监听器(listener)n源对象触发一个事件,关心该事件的对象处理该事件,后一个对象称为监听器。source:SourceClass +a
25、ddXListener(listener:XListener)listener:ListenerClass 用户行为 触发一个事件 XListener +handler(event:XEvent)事件的监听、注册和处理o用监听器处理源对象事件的条件:1.监听器对象的类必须是相应的事件监听器接口的实例2.监听器对象必须由源对象注册实例o编写一个GUI,其中有一个按钮,点击该按钮,控制台将打印字符串。实例o编写一个计算器界面,并显示用户输入的算式。内部类监听器o内部类n定义在某类内部的类,即内部类(嵌套类)。n内部类可以引用定义在它嵌套的外部类中的数据与方法匿名内部类监听器监听器接口适配器o适配器
26、提供了相应监听器中所有方法的默认实现,这些默认实现都是空的程序体。适配器适配器接口接口WindowAdapterWindowListenerMouseAdapterMouseListenerMouseMotionAdapterMouseMotionListenerKeyAdapterKeyListenerContainerAdapterContainerListenerCompentAdapterCompentListenerFocusAdapterFocusListener监听器接口适配器鼠标事件鼠标事件侦听器键盘事件键盘事件侦听器Java.awt.event.KeyListenerkeyPressed(e:KeyEvent):voidkeyRelseaed(e:KeyEvent):voidkeyTyped(e:KeyEvent):void在源组件上按下键后调用在源组件上放开键后调用在源组件上按下然后放开键后调用