1、Java面向对象程序设计 第10章,Java Swing图形用户界面,主讲:王美丽 办公室:信息学院204Email: meili_,主要内容,AWT与Swing Swing常用的控件 窗口事件、鼠标事件和键盘事件 难点窗口事件、鼠标事件和键盘事件,10.1 AWT,AWT:Abstract Window Toolkit Java抽象窗口工具包 提供了许多用来设计GUI的组件类。Java的java.awt 包,特点: 提供了一套与本地图形界面进行交互的接口。 操作系统所提供的图形库(平台无关性差) 由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。,10.1 Jav
2、a Swing概述,Swing:利用AWT下层的图形、颜色、字体、工具包及布局管理器等构件设计; 使用“Java基类(JFC)”(Java Foundation Classes,是用于可发跨平台GUI组件的Java类库)从根本上代替了一些陈旧的东西。,Swing,Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。,由于 Swing 控件是用100%的Java代码来实现的,因此在一个平台上可以在其他平台上使用。,由于在Swing 中没有使用本地方法来实现图形功能,我们通常把Swing控件称为
3、轻量级控件。,AWT与Swing的区别与联系,AWT 是基于本地方法,其运行速度比较快; Swing是基于AWT 程序,其运行速度比较慢。 联系:Swing组件的事件机制和布局,就是直接延用的AWT组件的。,结论:如果做一个applet或者嵌入式开发,而且不需要过多的部件,可以使用,这样速度会快些; 如果做一个独立application,可以使用swing,这样会漂亮一点。 Swing的关键技术在于AWT,所以必须熟悉AWT技术。,Java Swing类层次图,组件、容器、布局,1. 顶层容器组件(包括:JFrame、JDialog、JWindow、JApplet),2. 轻量级组件轻量级组件
4、都是JComponent类的子类。,在 javax.swing 包中,主要包含两种类型的组件:,Swing常用控件,10.2 窗口,框架 (Frame, JFrame) 是 Java 图形用户界面的基础,它就是我们通常所说的窗口,是 Windows/XWindow 应用程序的典型特征。,Java提供的JFrame类的实例是一个底层容器,即通常所称的窗口。其他组件必须被添加到底层容器中,以便借助这个底层容器和操作系统进行信息交互。(注意不允许将一个窗口添加到另一个容器中),JFrame类是Container类的间接子类。当需要一个窗口时,可使用JFrame或其子类创建一个对象。,10.2.1 J
5、Frame常用方法,JFrame() 创建一个无标题的窗口。 JFrame(String s) 创建标题为s的窗口。 public void setBounds(int a,int b,int width,int height 设置窗口的初始位置是(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。 public void setSize(int width,int height) 设置窗口的大小。,10.2.1 JFrame常用方法,public void setLocation(int x,int y) 设置窗口的位置,默认位置是(0,0)。 pu
6、blic void setVisible(boolean b) 设置窗口是否可见,窗口默认是不可见的。 public void setResizable(boolean b) 设置窗口是否可调整大小,默认可调整大小。 public void dispose() 撤消当前窗口,并释放当前窗口所使用的资源。,10.2.2 菜单条、菜单、菜单项,1菜单条 JComponent类的子类JMenubar负责创建菜单条,JFrame类有一个将菜单条放置到窗口中的方法:setJMenuBar(JMenuBar bar);该方法将菜单条添加到窗口的顶端 。,10.2.2 菜单条、菜单、菜单项,2菜单:JCom
7、ponent类的子类JMenu负责创建菜单, JMenu类的主要方法有以下几种 JMenu() 建立一个空标题的菜单。JMenu(String s) 建立一个指定标题菜单,标题由参数s确定。 public void add(JMenuItem item) 向菜单增加由参数item指定的菜单选项。public JMenuItem getItem(int n) 得到指定索引处的菜单选项。public int getItemCount() 得到菜单选项的数目。,10.2.2 菜单条、菜单、菜单项,3.菜单项 JComponent类的子类JMenuItem负责创建菜单项:JMenuItem(Strin
8、g s) 构造有标题的菜单项。 JMenuItem(String text, Icon icon) 构造有标题和图标的菜单项 new JmenuItem(“菜单项1”,new ImageIcon(“a.gif”) /工程文件下面 public String getText() 得到菜单选项的名字。 public void setText(String name) 设置菜单选项的名字为参数name指定的字符串。 public void setAccelerator(KeyStroke keyStroke) 为菜单项设置快捷键。,10.2.2 菜单条、菜单、菜单项,4嵌入子菜单JMenu是JMen
9、uItem的子类,因此菜单本身也是一个菜单项,当把一个菜单看作菜单项添加到某个菜单中时,称这样的菜单为子菜单。public void add(JMenuItem item) 向菜单增加由参数item指定的菜单选项。,10. 3 文本框,使用JComponent的子类JTextField创建文本框。 特点:用户在文本框中输入单行文本。JTextField() 创建文本框,文本框的长度为一个机器字符长。JTextField(int x) 创建文本框,文本框的长度为x个机器字符长。TextField(String s ) 创建文本框,文本框的初始字符串为s。,10.3.1 JTextField类的主
10、要方法,public void setText(String s) 设置文本框中的文本为参数s指定的文本。public String getText() 获取文本框中的文本。public void setEditable(boolean b) 指定文本框的可编辑性。文本框默认为可编辑的。,10.3.1 JTextField类的主要方法,setHorizontalAlignment(int alignment) 设置文本框中文本的对齐方式,其中alignment的有效值是JTextField.LEFT、JTextField.CENTER、JTextField.RIGHT 。public void
11、 addActionListener(ActionListener) 向文本框增加动作监视器(将监视器注册到文本框)。public void removeActionListener(ActionListener) 移去文本框上的动作监视器。,10. 4 密码框,使用JComponent的子类JPasswordField创建密码框。文本框的密码框是允许用户在密码框中输入单行密码,密码框的默认回显字符是*。 密码框常用方法:setEchoChar(char c):重新设置回显字符。char getPassword():返回实际的密码。 例题10-9,10. 5 文本区,JComponent的子类
12、JTextArea负责创建文本区,用户可以在文本区输入多行的文本。,10.7 布局,当把组件添加到容器中时,希望控制组件在容器中的位置,这就需要学习布局设计的知识。布局管理器:其实就是一个自动的排版机,选定一种布局管理器也就确定了一种控件的排版方式。使用布局管理器的缺点是控件在屏幕上的确切位置难以确定,10.7 布局,GUI所提供的六种布局管理器: JFlowLayout(顺序) JGridLayout(网格) GridBagLayout (网格包) BorderLayout(边框) CardLayout(卡片) BoxLayout(盒式) null布局,10.7.1 FlowLayout布局
13、,FlowLayout类创建的对象称做FlowLayout型布局。 JPanel型容器的默认布局。 FlowLayout类的一个常用构造方法如下: FlowLayout(); 该构造方法可以创建一个居中对齐的布局对象。例如:FlowLayout flow=new FlowLayout(); 如果一个容器con使用这个布局对象 con.setLayout(flow);con可以使用Container类提供的add方法将组件顺序地添加到容器中 . FlowLayout类的两个常用方法如下: setAlignment(int aligin):重新设置布局的对齐方式 setHgap(int hgap)
14、和setVgap(int vgap):重新设置水平间隙和垂直间隙。,10.7.2 BorderLayout布局,BorderLayout 布局是Window型容器(JFrame)的默认布局。如果一个容器使用这种布局,那么容器空间简单地划分为东、西、南、北、中五个区域,中间的区域最大。,10.7.3 CardLayout 布局,使用CardLayout 的容器可以容纳多个组件,这些组件被层叠放如容器中,最先加入容器的是第一张(在最上面),依次向下排序。 如制作Windows 风格的用户向导界面来依次显示一系列面板。,10.7.4 GridLayout布局,GridLayout是使用较多的布局编辑
15、器,其基本布局策略是把容器划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小格中。,10.7.5 BoxLayout布局,用BoxLayout类可以创建一个布局对象,称为盒式布局。将组件排列成一行或者一列。,10.7.6 null布局,1例如,p是某个容器 p.setLayout(null);把p的布局设置为空布局。2向空布局的容器p添加一个组件c需要两个步骤首先,容器p使用add(c)方法添加组件然后组件c再调用setBounds(int a,int b,int width,int height)方法设置该组件在容器p中的位置和本身的大小。,按钮与标签,Jbutton Jlabel
16、JLabel j= new JLabel(“标签“, new ImageIcon(“1.jpg“),0);,2010-1-10,30,10. 13 Component类的常用方法,Component类是所有组件的父类。组件都是矩形形状,组件本身有一个默认的坐标系。,10.13.1 组件的颜色,1、组件的常用方法public void setBackground(Color c) 设置组件的背景色。public void setForeground(Color c) 设置组件的前景色。public Color getBackground() 获取组件的背景色。public Color getFo
17、reground() 获取组件的前景色。2、Color类的构造方法public Color(int red,int green,ing blue) Color类在java.awt包中。,10.13.2 组件的字体,1、组件的常用方法public void setFont(Font f) 设置组件上的字体。public Font getFont() 获取组件上的字体。2、Font类创建的对象称为字体对象。Font类的构造方法是:public Font(String name,int style,int size); Font类在java.awt包中。 3、获取计算机上所有可用的字体名称,并存放到
18、字符串数组中GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();String fontName=ge.getAvailableFontFamilyNames();,10.13.3 组件的大小与位置,public void setSize(int width,int height) 设置组件的大小。 public void setLocation(int x,int y) 设置组件在容器中的位置。 public Dimension getSize()返回一个Dimension对象,该对像含有名字是wid
19、th和height的成员变量,width的值就是组件的宽度、height的值就是组件的高度。 public Point getLocation()返回一个Point对象的引用,该对像含有名字是x和y的成员变量,x,y的值就是组件的左上角在容器的坐标系中的x坐标和y坐标。 public void setBounds(int x,int y,int width,int height)设置组件在容器中的位置和组件的大小.该方法相当于setSize方法和setLocation方法的组合。 public Rectangle getBounds() 返回一个Rectangle对象的引用,该对象含有名字是x
20、、y、width 和height的成员变量, x,y的值就是组件的左上角在容器的坐标系中的x坐标和y坐标,width和height的值就是组件的宽度和高度。,事件,总结,GUI的类库分为三种类:组件类、容器类、布局管理器类; 常用的容器有:JFrame和JPanel,JPanel必须放在Frame中; 常见的组件有:JButton,JTextField,JLabel等; 常用的布局有:FlowLayout流式布局,BorderLayout边框布局,GridLayout网格布局; 可用方法为容器设置其可见性,大小,出现坐标等属性。 JTextComponent是Swing文本组件的根类 Swing中用于选择性输入的常用组件有:JCheckBox、JRadioButton、JList、JComboBox 菜单是 GUI 中非常有用的一部分,谢谢!,Java面向对象程序设计 第10章,