1、Songtie Aug 2011,第01章 Swing基本组件,图形用户界面(GUI),图形用户界面(GUI)为程序提供了图形界面,使程序的外观和风格更有特色。 Java基础类库提供了若干图形用户界面类以及支持窗口界面的开发,这些类一般都位于java.awt和java.swing包中。,AWT概述,awt(Abstract Window Toolkit)包是java1.0所提供的图形界面开发包。 在awt中包含了多种基本的界面控件类、图片处理Image类、绘图的Graphics、Graphics2D类以及处理用户输入事件的Event类。 由于awt中的类直接使用了一些与平台有关的底层类,这使得
2、awt类的界面效果在不同平台上表现不一致,因而兼容性比较差。,AWT的类体系结构,Swing概述,Java2的swing包对awt包进行了修订和扩展,swing中的控件类比awt更加丰富,新增一些复杂控件。 swing的类不再含有与平台相关的技术,而是把这些平台相关技术留给了运行环境来处理,因而swing类是纯粹的java产物,具有最大程度的平台兼容能力。 Swing中的类基本上都是以J字母开头,其中作为swing的各种控件类的父类的JComponent类继承于awt包的Container类,可见Java还需要继续保留java.awt包。,Swing的类体系结构,Swing概述,我们将常用的S
3、wing组件根据其性质不同,分类进行介绍,其中包括: 容器组件 文本组件 表单组件,Swing容器组件,容器组件是指可以容纳其它组件的组件,常用的Swing容器包括: JFrame(框架) Container(容器) JDialog(对话框) JPanel(面板) JScrollPane(滚动面板),javax.swing.JFrame,JFrame组件用于在Swing程序中创建窗体; JFrame类的构造方法有4种重载方式,以下是常用的几种:,JFrame常用方法,创建JFrame(窗体)示例,import javax.swing.*; /导入必要的包/*自定义窗体类,继承于JFrame类*
4、/ public class MyFrame extends JFrame /*构造方法*/public MyFrame()/super(“这是我的第一个窗体“); /利用父类的构造方法设置标题this.setTitle(“这是我的第一个窗体“); /设置窗体的标题this.setSize(300, 200); /设置窗体的大小this.setVisible(true); /设置窗体为可见,即显示窗体/*main方法,程序入口*/public static void main(String args)MyFrame mf = new MyFrame(); /创建窗体实例 ,java.awt.C
5、ontainer,事实上,一个完整的窗体是由外部框架和内容面板两部分组成的; 外部框架是指由标题栏和四边所组成空心边框,它主要用来控制窗体的大小和外观; 我们实际操作的是内容面板,如设置窗体的背景色,设置窗体的布局,往窗体中添加其它组件等等; 使用getContentPane方法获得当前窗体的内容面板,该方法的返回值是Container(容器)类对象,如:Container contentPane = getContentPane(); Container类在java.awt包中。,Container常用方法,Container使用示例,import java.awt.*; /Containe
6、r类和Color类在此包中 import javax.swing.*;public class ContentPaneDemo extends JFrame public ContentPaneDemo() super(“内容面板示例“);/获得当前窗体的内容面板Container contentPane = this.getContentPane();/设置内容面板的背景色为红色contentPane.setBackground(Color.RED);/设置窗体关闭时即退出程序setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300
7、, 200);setResizable(false); /设置窗体不可调整大小setVisible(true);public static void main(String args) ContentPaneDemo cpd = new ContentPaneDemo(); ,java.awt.Color,Color类用于创建颜色对象,其构造方法共有7种重载方式,以下是常用的几种,javax.swing.JDialog,JDialog用于在程序中创建对话框组件,对于多窗口的程序而言,对话框尤为重要; 对话框其实就是轻量级的窗体,它比JFrame消耗更少的系统资源; 它与JFrame的区别在于,
8、JFrame可以在程序中不依赖于其它窗体单独存在,而JDialog则必须依赖于其它窗口,一般做辅助窗口呈现; 但更重要的是,JDialog支持模式显示。 所谓模式显示,是指窗口以不丢失焦点的独占方式显示。,JDialog示例,JDialog,javax.swing.JPanel,JPanel提供面板组件,它是轻量级的容器组件; 面板中可以添加其它组件,也可以设置布局,我们一般使用面板来实现布局嵌套;,javax.swing.JScrollPane,JScrollPane是滚动面板组件,当某些组件的可视区域不足以显示其全部内容时,可以将该组件添加到滚动面板中,为其增加滚动条。,Swing文本组件
9、,所谓文本组件是指专门用来存放文字的组件,包括: JButton(按钮) JLabel(标签),javax.swing.JButton,在Swing程序中,按钮可能是使用量最大的组件之一,JButton则是用来创建按钮的; JButton类的构造方法有5种重载方式,以下是常用的几种:,JButton的常用方法,javax.swing.JLabel,JLabel是最简单的Swing组件之一,用于在窗体上显示标签, JLabel既可以显示文本,也可以显示图像; JLabel类的构造方法有6种重载方式:,JLabel的常用方法,Swing中常用的表单组件,这里套用了HTML中的“表单”一词,常用的表
10、单组件包括: JTextField(文本框) JPasswordField(密码框) JTextArea(文本域) JCheckBox(复选框) JRadioButton(单选按钮) JComboBox(组合框,又名:下拉列表),javax.swing.JTextField,JTextField是文本框组件,主要用来接受用户的输入; JTextField类的构造方法有5种重载方式,以下是常用的几种:,JTextField的常用方法,javax.swing.JPasswordField,JPasswordField用来提供密码框组件,它的构造方法共有5种重载,以下是常用的几种:,JPasswro
11、dField的常用方法,javax.swing.JTextArea,当用户有大量文本需要输入的时候,就可以使用到文本域组件,JTextArea的构造方法共有6种重载,以下是常用的几种:,JTextArea的常用方法,java.awt.Font,Font类用来表示字体,常用的构造方法如下:常量Font.BOLD表示粗体,Font.ITALIC表示斜体,粗体加斜体可以用Font.BOLD + Font.ITALIC表示,Font.PLAIN表示普通样式; 任何包含有文字的组件,都可以使用setFont方法来设置字体。,javax.swing.JCheckBox,JCheckBox用来提供复选框组件
12、,一般用来提供多个选项,并且可选项不限定的情况下,可以使用到复选框; 其构造方法共有8种重载,常用的如下:,JCheckBox的常用方法,javax.swing.JRadioButton,JRadioButton提供单选按钮组件,其构造方法共有8种重载,以下是常用的几种:,JRadioButton常用方法,javax.swing.ButtonGroup,事实上,单选按钮本身并不具备单选效果,它必须依靠按钮组才能达到单选的目的; ButtonGroup用来提供按钮组,将一系列按钮加入到同一个按钮组中,那么同一按钮组中的按钮只能有一个被选择; ButtonGroup的构造方法如下:,ButtonG
13、roup的常用方法,javax.swing.JComboBox,使用JComboBox可以创建组合框组件,也就是俗称的下拉列表,以下是它的4种构造方法重载:,JComboBox的常用方法,表单组件示例,布局管理器,在MyEclipse中,组件的定位是靠坐标来完成的,而在手工编码中,坐标定位将是非常麻烦的工作; 用户界面上的组件可以按照不同的方式进行排列,例如:可以依序水平排列,或者按网格方式进行排列; 每种方案都是指组件的一种布局,要管理这些布局,就需要使用布局管理器; 布局管理器是一组实现了java.awt.LayoutManager接口的类,由这些类自动定位组件; 布局管理器类在java.
14、awt包中。,布局管理器,布局管理器用来: 决定组件在容器上如何摆放; 决定组件的大小; Frame的默认布局管理器是FlowLayout; JAVA中常用的布局: FlowLayout(流式布局) BorderLayout(边框布局) GridLayout(网格布局) CardLayout (卡片布局),几种常用布局,流式布局 java.awt.FlowLayout,边界布局 java.awt.BorderLayout,网格布局 java.awt.GridLayout,为容器设置布局,布局管理器(LayoutManager)指的是FlowLayout, BorderLayout等类的对象;
15、调用容器对象的setLayout(LayoutManager lm)方法,即可为容器设置不同的布局; 利用多种复杂布局的组合,总可以达到你想要的效果,FlowLayout,容器,流布局是面板的默认布局管理器,左上角,右下角,依次排序的组件,垂直或水平间距,流式布局示例,import java.awt.*; /布局管理器在此包中 import javax.swing.*;public class FlowLayoutDemo extends JFrame private JTextField txt1, txt2, txt3, txt4; /声明4个文本框public FlowLayoutDem
16、o() super(“流式布局示例“); /使用父类的构造方法设置窗体标题txt1 = new JTextField(“文本框1“); /分别实例化4个文本框txt2 = new JTextField(“文本框2“);txt3 = new JTextField(“文本框3“);txt4 = new JTextField(“文本框4“);Container me = getContentPane(); /获取当前窗体的内容面板me.setLayout(new FlowLayout(); /设置内容面板的布局为流式布局me.add(txt1); /分别将4个文本框添加到内容面板中me.add(tx
17、t2);me.add(txt3);me.add(txt4);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setVisible(true);public static void main(String args) new FlowLayoutDemo(); /实例化窗体,匿名对象 ,BorderLayout,上边的组件,左 边 的 组 件,右 边 的 组 件,下边的组件,容器,North,South,East,West,CENTER,边界布局示例,public class BorderLayoutDemo ex
18、tends JFrame private JButton btn1, btn2, btn3, btn4, btn5; /声明5个按钮public BorderLayoutDemo() btn1 = new JButton(“北边按钮“); /分别实例化5个按钮btn2 = new JButton(“南边按钮“);btn3 = new JButton(“西边按钮“);btn4 = new JButton(“东边按钮“);btn5 = new JButton(“中间按钮“);Container me = getContentPane();me.setLayout(new BorderLayout(
19、); /设置内容面板的布局为边界布局me.add(btn1, BorderLayout.NORTH); /分别将按钮添加到内容面板的各个方位me.add(btn2, BorderLayout.SOUTH);me.add(btn3, BorderLayout.WEST);me.add(btn4, BorderLayout.EAST);me.add(btn5, BorderLayout.CENTER);setTitle(“边界布局示例“);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setVisible(true
20、);public static void main(String args) new BorderLayoutDemo(); ,GridLayout,行,列,组件大小相同,重新调整组件大小 以适合各自的单元,指定网格中的行数和列数,创建网格布局,CardLayout,可存储几个不同的布局。 每个布局就像是一个卡片组中的一张卡片。 在一个给定的时间总会有一张卡片在顶层。 卡片通常为一个 Panel 对象。 每当需要许多面板切换,而每个面板需要显示为不同布局时,可以使用卡片布局,复杂布局,单独使用某种布局管理器很难实现相对复杂的布局效果,这往往需要多个布局管理器配合使用; 如下面的“猜数字游戏”界
21、面,就是边界布局配合网格布局实现的效果。,整个窗体的 内容面板采 用边界布局,边界布局的南 面嵌套1行3列 的网格布局,使用JPanel实现复杂布局,实现“猜数字游戏”界面,代码片段:,public class MainFrame extends JFrame private JTextField txtInput; /接受输入的文本框private JLabel lblMsg; /显示提示信息的标签private JPanel pnlSouth; /边界布局中,放在南边的面板,用于布局嵌套private JButton btnGuess, btnAnew, btnExit; /三个按钮pub
22、lic MainFrame() pnlSouth = new JPanel(); /创建面板pnlSouth.setLayout(new GridLayout(1, 3); /设置面板为1行3列的网格布局pnlSouth.add(btnGuess); /将三个按钮添加到面板中pnlSouth.add(btnAnew);pnlSouth.add(btnExit);Container me = getContentPane(); /获得窗体的内容面板me.setLayout(new BorderLayout(); /设置窗体的内容面板为边界布局me.add(txtInput, BorderLayo
23、ut.NORTH); /将组件添加到相应位置me.add(lblMsg, BorderLayout.CENTER);me.add(pnlSouth, BorderLayout.SOUTH); /将面板添加到边界布局的南面 ,网格布局示例,import java.awt.*; import javax.swing.*;public class GridLayoutDemo extends JFrame private JButton btnAry; /声明按钮数组public GridLayoutDemo() btnAry = new JButton9; /创建有9个按钮引用的数组Contain
24、er 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(“网格布局示例“);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setVisible(true);public static void main(String args) new GridLayoutDemo(); ,复杂布局,单独使用某种布局管理器很难实现相对复杂的布局效果,这往往需要多个布局管理器配合使用; 如下面的“猜数字游戏”界面,就是边界布局配合网格布局实现的效果。,整个窗体的 内容面板采 用边界布局,边界布局的南 面嵌套1行3列 的网格布局,思考:以下界面我们如何实现?,最自由的布局空布局,设置布局模式为NULL setLayout(NULL) 设置控件的坐标 setBounds(int x, int y, int width, int height),