1、GUI入门,了解AWT以及java.awt包 了解Swing组件和javax.swing包 手工编码实现GUI程序 掌握常用基本Swing组件的使用方法 掌握常用布局管理器 流式布局(FlowLayout) 边界布局(BorderLayout) 网格布局(GridLayout) 使用面板(JPanel)实现复杂布局,GUI入门,手工编码实现GUI程序 掌握常用基本Swing组件的使用方法 掌握常用布局管理器 流式布局(FlowLayout) 边界布局(BorderLayout) 网格布局(GridLayout),GUI的概念,到目前为止,我们在C和Java中编写的都是基于控制台的程序; GUI
2、(Graphical User Interface)即图形用户界面,它能够使应用程序看上去更加友好; Java语言之所以如此流行的一个主要原因,就是因为它支持GUI;,AWT简介,上一章我们已经知道,实现GUI编程是由一系列图形化组件来完成的(即一系列定义好的类),这些组件也被称为控件; 在Java的早期版本中,GUI组件由名为AWT(Abstract Window Toolkit,抽象窗口工具包)的标准库来提供; 除了GUI组件外,AWT还包括其它功能来支持图像绘画、处理剪切/复制类型的数据传送,以及其它相关操作。,java.awt包,java.awt包是Java内置的包,属于Java基础类
3、库(JFC)的一部分,其中包括以下内容: 便于用户输入的一组丰富的界面组件; 将组件放置在适当位置的几种布局管理器; 事件处理模型; 图形和图像工具等等。 要使用到该包中的类,则必须显式地声明如下语句:import java.awt.*;,AWT组件的类体系结构,AWT编程示例,AWT组件最大的缺陷是它依赖于操作系统,也就是说,AWT程序运行在不同的操作上会有不同的外观和行为,这一点对于Java的平台无关性来讲,是无法容忍的。,Swing简介以及javax.swing包,Swing组件是在AWT组件基础上发展而来的轻量级组件,与AWT相比不但改进了用户界面,而且所需的系统资源更少; Swing
4、是纯Java组件,使得应用程序在不同的平台上运行时具有相同外观和相同的行为。 javax.swing包中包含了一系列Swing组件,如果要使用该包中的类,则必须显式地声明如下语句:import javax.swing.*;,Swing组件的类体系结构,常用的基本Swing组件,在Swing编程中,有一些经常要使用到的组件,其中包括: JFrame(窗体,框架) JButton(按钮) JLabel(标签) JTextField(文本框),javax.swing.JFrame,JFrame组件用于在Swing程序中创建窗体; JFrame类的构造方法有4种重载方式,以下是常用的几种:,JFram
5、e的常用方法,创建窗体,对于类似于窗体这样的容器组件,我们一般自定义一个类,继承于JFrame类,然后将窗体中的子组件作为类中成员进行声明,以方便操作,如:public class MyFrame extends JFrame 容器组件是指可以容纳其它组件的组件。,创建窗体示例,import javax.swing.*; /导入必要的包/*自定义窗体类,继承于JFrame类*/ public class MyFrame extends JFrame /*构造方法*/public MyFrame()/super(“这是我的第一个窗体“); /利用父类的构造方法设置标题this.setTitle(
6、“这是我的第一个窗体“); /设置窗体的标题this.setSize(300, 200); /设置窗体的大小this.setVisible(true); /设置窗体为可见,即显示窗体/*main方法,程序入口*/public static void main(String args)MyFrame mf = new MyFrame(); /创建窗体实例 ,窗体的内容面板,一个完整的窗体是由外部框架和内容面板两部分组成的; 外部框架是指由标题栏和四边所组成空心边框,它主要用来控制窗体的大小和外观; 我们实际操作的是内容面板,如设置窗体的背景色,设置窗体的布局,往窗体中添加其它组件等等; 使用ge
7、tContentPane方法获得当前窗体的内容面板,该方法的返回值是Container(容器)类对象,如:Container contentPane = getContentPane(); Container类在java.awt包中。,java.awt.Container,Container类通常用于操作JFrame的内容面板,其常用的方法有:,内容面板示例,import java.awt.*; /Container类和Color类在此包中 import javax.swing.*; public class ContentPaneDemo extends JFrame public Cont
8、entPaneDemo() super(“内容面板示例“);/获得当前窗体的内容面板Container contentPane = this.getContentPane();/设置内容面板的背景色为红色contentPane.setBackground(Color.RED);setSize(300, 200);setResizable(false); /设置窗体不可调整大小setVisible(true);public static void main(String args) ContentPaneDemo cpd = new ContentPaneDemo(); ,java.awt.Co
9、lor,Color类用于创建颜色对象,其构造方法共有7种重载方式,以下是常用的几种:Color类中还提供一系列静态的颜色常量:,javax.swing.JButton,在Swing程序中,按钮可能是使用量最大的组件之一,JButton则是用来创建按钮的; JButton类的构造方法有5种重载方式,以下是常用的几种:,JButton的常用方法,javax.swing.JLabel,JLabel是最简单的Swing组件之一,用于在窗体上显示标签, JLabel既可以显示文本,也可以显示图像; JLabel类的构造方法有6种重载方式:,JLabel的常用方法,javax.swing.JTextFie
10、ld,JTextField是文本框组件,主要用来接受用户的输入; JTextField类的构造方法有5种重载方式,以下是常用的几种:,JTextField的常用方法,布局管理器,用户界面上的组件可以按照不同的方式进行排列,例如:可以依序水平排列,或者按网格方式进行排列; 每种方案都是指组件的一种布局,要管理这些布局,就需要使用布局管理器; 布局管理器是一组实现了java.awt.LayoutManager接口的类,由这些类自动定位组件; 布局管理器类在java.awt包中。,几种常用布局,流式布局 java.awt.FlowLayout,边界布局 java.awt.BorderLayout,网
11、格布局 java.awt.GridLayout,流式布局示例,import java.awt.*; /布局管理器在此包中 import javax.swing.*;public class FlowLayoutDemo extends JFrame private JTextField txt1, txt2, txt3, txt4; /声明4个文本框public FlowLayoutDemo() super(“流式布局示例“); /使用父类的构造方法设置窗体标题txt1 = new JTextField(“文本框1“); /分别实例化4个文本框txt2 = new JTextField(“文本
12、框2“);txt3 = new JTextField(“文本框3“);txt4 = new JTextField(“文本框4“);Container me = getContentPane(); /获取当前窗体的内容面板me.setLayout(new FlowLayout(); /设置内容面板的布局为流式布局me.add(txt1); /分别将4个文本框添加到内容面板中me.add(txt2);me.add(txt3);me.add(txt4);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setVisibl
13、e(true);public static void main(String args) new FlowLayoutDemo(); /实例化窗体,匿名对象 ,边界布局示例,public class BorderLayoutDemo extends JFrame private JButton btn1, btn2, btn3, btn4, btn5; /声明5个按钮public BorderLayoutDemo() btn1 = new JButton(“北边按钮“); /分别实例化5个按钮btn2 = new JButton(“南边按钮“);btn3 = new JButton(“西边按钮
14、“);btn4 = new JButton(“东边按钮“);btn5 = new JButton(“中间按钮“);Container me = getContentPane();me.setLayout(new BorderLayout(); /设置内容面板的布局为边界布局me.add(btn1, BorderLayout.NORTH); /分别将按钮添加到内容面板的各个方位me.add(btn2, BorderLayout.SOUTH);me.add(btn3, BorderLayout.WEST);me.add(btn4, BorderLayout.EAST);me.add(btn5, B
15、orderLayout.CENTER);setTitle(“边界布局示例“);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setVisible(true);public static void main(String args) new BorderLayoutDemo(); ,网格布局示例,import java.awt.*; import javax.swing.*;public class GridLayoutDemo extends JFrame private JButton btnAry; /声明
16、按钮数组public GridLayoutDemo() btnAry = new JButton9; /创建有9个按钮引用的数组Container me = getContentPane();me.setLayout(new GridLayout(3, 3); /将内容面板设置为3行3列的网格布局/循环实例化按钮,并逐一将按钮添加到内容面板上for (int i = 0; i btnAry.length; i+) btnAryi = new JButton(“按钮“ + (i + 1);me.add(btnAryi);setTitle(“网格布局示例“);setDefaultCloseOper
17、ation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setVisible(true);public static void main(String args) new GridLayoutDemo(); ,复杂布局,单独使用某种布局管理器很难实现相对复杂的布局效果,这往往需要多个布局管理器配合使用; 如下面的“猜数字游戏”界面,就是边界布局配合网格布局实现的效果。,整个窗体的 内容面板采 用边界布局,边界布局的南 面嵌套1行3列 的网格布局,javax.swing.JPanel,JPanel提供面板组件,它是轻量级的容器组件; 面板中可以添加其它组件,也
18、可以设置布局,我们一般使用面板来实现布局嵌套; JPanel类的构造方法有4种重载方式,以下是常用的几种:,JPanel的常用方法,JPanel(面板)的操作方式与Container(内容面板)很相似,以下是一些常用方法:,事件处理,对于采用了图形用户界面的程序来说,事件控制是非常重要的; 到目前为止,我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能,要实现相应的功能,必须进行事件处理; 用户与GUI组件进行交互就会发生事件,如:按下一个按钮、用键盘输入一个字符、点击鼠标等等; 当前我们要关注的并不是“事件是如何产生的”,而是讨论当发生事件后,我们应当“如何处理之”。,事件
19、处理模型,Java中,事件处理的基本思路如下: 一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件; 一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知。,事件源与事件,当在一个图形用户界面点击鼠标或者按下键盘时,都是针对于具体组件而发生的动作,如:使用鼠标点击某个按钮;按下键盘向文本框输入内容等等; 我们把动作所操纵的对象称为事件源,请注意:事件源一定是指某个组件; 当针对于事件源发生动作时,就会产生一个事件。,监听器与监听器接口,针对每一类型的事件,都有与之相对应的监听器,用于监听事件的
20、发生; 在Java中,监听器由一系列接口来提供; 实际上,事件监听器就是实现了事件监听接口的类,监听器不断监听事件源的动作,当事件源产生一个事件后,监听器接收到事件源的通知,就调用特定的方法,以执行指定的动作。 特定的事件监听器只对特定的事件感兴趣。,java.awt.event包,java.awt.event包中包含了一系列与事件处理相关的类和接口,其中包括:监听器接口,事件对象和事件适配器等; 一般来说,编写图形用户界面程序都必须显式地导入此包; 每种事件监听器接口都是以类似于XxxListener的形式来命名的,如:ActionListener、MouseListener、ItemLis
21、tener等;,ActionListener接口,按钮被点击是图形编程中最普遍的事件,我们经常要处理; ActionListener被称为活动监听器,一般用来监听按钮的点击事件; 该接口中包含有一个抽象方法,原型如下:public void actionPerformed(ActionEvent ae);实现该监听器接口必须重写上面的方法。,import java.awt.*; import java.awt.event.*; import javax.swing.*;public class EventDemo extends JFrame implements ActionListener
22、private JLabel lblMsg;private JButton btnClick;public EventDemo() lblMsg = new JLabel(“请点击下面的按钮.“);btnClick = new JButton(“请点击我“);Container cpMe = getContentPane();cpMe.setLayout(new BorderLayout();cpMe.add(lblMsg, BorderLayout.CENTER);cpMe.add(btnClick, BorderLayout.SOUTH);setTitle(“ActionListener
23、Demo“);btnClick.addActionListener(this); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setResizable(false); /设置不允许用户自行调整窗口大小setVisible(true);public void actionPerformed(ActionEvent ae) lblMsg.setText(“我被点击了!“); /设置标签中的文本public static void main(String args) new EventDemo(); ,import
24、 java.awt.*; import java.awt.event.*; import javax.swing.*;public class EventDemo extends JFrameprivate JLabel lblMsg;private JButton btnClick;public EventDemo() lblMsg = new JLabel(“请点击下面的按钮.“);btnClick = new JButton(“请点击我“);Container cpMe = getContentPane();cpMe.setLayout(new BorderLayout();cpMe.a
25、dd(lblMsg, BorderLayout.CENTER);cpMe.add(btnClick, BorderLayout.SOUTH);setTitle(“ActionListener Demo“);btnClick.addActionListener(new MyListener(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setResizable(false); /设置不允许用户自行调整窗口大小setVisible(true);class MyListener implements Actio
26、nListener public void actionPerformed(ActionEvent ae) /实现事件处理函数lblMsg.setText(“我被点击了!“);public static void main(String args) new EventDemo(); ,import java.awt.*; import java.awt.event.*; import javax.swing.*;public class EventDemo extends JFrameprivate JLabel lblMsg;private JButton btnClick1;private
27、 JButton btnClick2;public EventDemo() lblMsg = new JLabel(“请点击下面的按钮.“);btnClick1 = new JButton(“确定“);btnClick2 = new JButton(“取消“);Container cpMe = getContentPane();cpMe.setLayout(new FlowLayout();cpMe.add(lblMsg);cpMe.add(btnClick1);cpMe.add(btnClick2);setTitle(“ActionListener Demo“);btnClick1.addA
28、ctionListener(new MyListener();btnClick2.addActionListener(new MyListener(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setResizable(false); /设置不允许用户自行调整窗口大小setVisible(true);class MyListener implements ActionListener public void actionPerformed(ActionEvent ae) /实现事件处理函数if(ae.getSource()=btnClick1)lblMsg.setText(“确定!“);if(ae.getSource()=btnClick2)lblMsg.setText(“取消!“);public static void main(String args) new EventDemo(); ,