1、图形界面程序设计讲稿图形界面程序设计Part I:界面设计使用图形组件类和容器类进行GUI设计时,需要引入相应的包或者类。在Java 中,能够实现图形用户界面的类库有两个:java.awt 和javax.swing。前者称为抽象窗口工具库AWT(Abstract Windows Toolkit),后者是Java 基础类库JFC(Java Foundation Classes)的一个组成部分,它提供了一套功能更强、数量更多、更美观的图形用户界面组件。Swing 组件名称和AWT 组件名称基本相同,但以J 开头,例如AWT 按钮类的名称是Button,在Swing 中的名称则是JButton。在j
2、ava中,AWT包中的类是用来处理图形的最基本的方式,它是Sun公司早期所推出和使用的图形组件包,其中的组件包含基本GUI组件类、容器类、布局管理类,事件处理类和基本图形类这五种。AWT包中的组件被认为是重量级组件,AWT在实际运行中是调用所在平台的图形系统,它们依赖于本地系统来支持绘图与显示,其运行速度慢效果差,系统相关性较强。在1998年Sun Microsystem推出JDK1.2版本时,新的javax.Swing包被增加到java的基础类库中。Swing包可以认为是AWT包的升级。它不仅拥有几倍于AWT包的用户界面组件,而且同样的组件,Swing包中的组件往往可设置属性更多,功能更强大
3、丰富。例如Swing包中按钮(Button)的功能较AWT包中的按钮功能更加强大,包括给按钮添加图像、使用快捷键以及设置按钮的对齐方式,还可以给按钮加入图片做背景。Swing采用MVC(模型-视图-控制)的设计范式,使程序员可以根据不同的操作系统来选择不同的外观。Swing组件完全是用Java代码实现的,可以跨平台,使用Swing组件的程序在Mac、Windows或Unix平台上的观感都一样。Swing组件通常被称为轻量级组件。程序设计过程中最好不要混用Swing组件和AWT组件,虽然有时候也可以同时用,但有可能在视觉效果和响应上造成不稳定隐患。AWT包中常用的顶层容器为Frame、Dialo
4、g、Applet,中间层容器为Panel(中间层容器是一种可以放到顶层容器上的组件,它可以把顶层容器进行进一步的区域划分以设计所需格局的界面)。常用的普通组件有Button、TextField、TextArea、Label、List等。Swing包中的组件分类主要为:(1)顶层容器:JFrame、JApplet、JApplet、JDialog。(2)中间层容器:JPanel、JScrollPane、JSplitPane、JToolBar。(3)其它基本组件:JButton、JList、JTextField等。关于布局,其实每种容器都有默认的布局,当设计者没有指定使用另外的布局时,放到它上面的组
5、件就会按默认布局方式摆放。在AWT和Swing中都可对容器设置布局,都是调用容器对象的setLayout方法。布局有几种,这里作简单说明,具体请大家从示例程序的运行以及JDK API文档中查阅这些布局类的说明文档来体会:(1)FlowLayout布局:顺序布局,有时又称流式布局。使用该布局时,容器上的元素会按容器显示时的大小,按照从左到右、从上倒下的一行一行摆放下去。(2)BorderLayout布局:边界布局。它可以把容器分为东西南北中5个方位,可以指定某个组件在哪个方位(但注意并非一定要有5个组件摆上去,不足5个也可指定位置摆放)。(3)GridLayout布局:网格布局。可以指定容器上的
6、元素按几行几列的位置顺序摆放。(4)CardLayout布局:卡片布局。使用该布局的容器可放置多个组件,但同一时刻只能显示其中一个,就像一叠叠整齐的纸牌中每次只能最上面一张一样。可以指定哪个组件被显示。(5)null布局:空布局。空布局并非没有布局,而是容器被设置为这种布局以后,放到它上面的每个组件就可以通过setBounds(int a,int b,int width,int height)来设置其具体的位置。(6)另外还有BoxLayout(盒式布局)、GridBagLayout(网格包布局)等不常用布局。 在具体的程序设计时,上述每一种布局都对应是一个类,用它们定义出来的对象作为容器对象
7、的setLayout方法的参数,就可以把容器设置成该参数所对应的布局了。仔细阅读、体会、运行和模仿学习后面的多个例子程序(注意代码注释中所提示的各种细节问题),我们可以最后再次总结出“界面设计”的步骤:(1)定义顶层容器对象。 (2)用容器对象的setLayout方法给容器设置一种布局。 (3)定义普通图形组件。 (4)调用容器对象的add方法将普通图形组件添加到容器上。 其中步骤(1)和(3)一般放在图形界面程序类的成员变量声明部分。(2)和(4)一般放在类的构造函数部分。 最后在main函数中生成图形界面程序类的实例运行,显示出界面来。 /* 例子3.1,关于容器Frame的使用。*/im
8、port java.awt.Frame;public class FrameApp public static void main(String args) Frame frame=new Frame(); /定义一个Frame容器对象frame frame.setSize(200,100);frame.setVisible(true); /注意Frame对象默认是不可见的,尝试注释掉此句,你会发现看 /不到运行结果的窗口出现。 /* * 例子3.2,关于容器JFrame的使用。 同上例。 */import javax.swing.JFrame;public class JButtonApp
9、public static void main(String args) JFrame jframe = new JFrame(); / 定义一个JFrame容器对象jframe jframe.setSize(200, 100); jframe.setVisible(true);/ 注意JFrame对象默认是不可见的,若注释掉此句,你会发现看 / 不到运行结果的窗口出现。 jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/JFrame表面上可以关闭, / 实际上只是被隐藏为不显示。要真正可以关闭它,必须让JFrame对象 / 调用se
10、tDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)这样的方法来实现关闭功能。 /* * 例子3.3,本例演示使用容器JFrame,设计一个基本的图形界面程序的过程和方法。请注意注释 * 所提示的一些应该注意的细节问题。 */import java.awt.FlowLayout;import java.awt.Font;import java.awt.Color;import javax.swing.JButton;import javax.swing.JFrame;public class JButtonApp JFrame jf=new JFrame()
11、; /定义设计图形界面程序所需的容器对象 JButton button1=new JButton(按钮1); /定义界面上需要的按钮button1,以下类似 JButton button2=new JButton(按钮2); JButton button3=new JButton(按钮3); public JButtonApp() /一般总是用构造函数用于把普通组件添加到容器上构造出界面来! jf.setLayout(new FlowLayout();/当没有使用任何布局的时候,JFrame容器只会显示代码中最 /后使用add方法添加上去的组件。假如这条设置布局的语句被 /注释掉的话,程序运行
12、后界面上将会只显示按钮3这一个按钮 jf.getContentPane().add(button1);/往容器上面添加按钮button1。注意如果是往AWT中的Frame /容器对象上面添加任何组件的话,都是调用该对象的add方 /法,以组件对象名作为参数添加即可。但对于Swing中的 /JFrame,必须先通过getContentPane()方法获取其内容面 /板,然后再调用add方法添加组件。 jf.getContentPane().add(button2); jf.getContentPane().add(button3); jf.getContentPane().setBackgrou
13、nd(Color.RED); /把jf的背景色设置为红色。 button1.setFont(new Font(隶书,Font.PLAIN,20); /给按钮button1设置字体。 jf.setVisible(true);/JFrame容器对象默认是不可见的,必须要设置为可见,界面才会出来。 jf.pack(); /如果尝试不调用pack函数,默认出来的界面不会显示全部组件。pack的作用是使 /界面上的所有组件以最经济的方式全部显示出来。 public static void main(String args) JButtonApp jba=new JButtonApp(); /生成对象实例
14、,在此过程中构造函数会被调用 /运行,界面即出现 /* 例子3.4,本例演示容器Applet的使用。*/import java.applet.Applet;import javax.swing.JTextField;public class JTextFieldApp extends Applet /这是一个Applet程序,Applet实际上也是一种容器! JTextField jtxtfld1,jtxtfld2; /定义两个JTextField类型的组件 public void init() jtxtfld1=new JTextField(20); /生成对象实例 jtxtfld2=new
15、 JTextField(20); add(jtxtfld1); /将组件添加到容器Applet上 add(jtxtfld2); jtxtfld2.setEditable(false); /将其中的jtxtfld2设置为不可编辑的,即不能往里输入东西 /* 例子3.5,本例演示FlowLayout布局(顺序布局)的使用。这种布局就是按照调用add方法添加组件的顺序* 从左到右、从上到下摆放组件,下面的程序中的5个按钮就是按照这样布局的。*/import java.awt.*;import java.awt.event.*;public class FlowLayoutApp extends Fr
16、ame /这个例子程序不是在程序中定义Frame容器对象作为 /容器,而是继承自Frame类。这隐含着是以Frame作 /为顶层容器。 public FlowLayoutApp() /构造函数 super(An FlowLayout Example); /调用父类的构造函数设置顶层容器的标题 setLayout(new FlowLayout(); setBackground(Color.green); /以绿色作为界面的背景色 setVisible(true); /容器设置为可见 add(new Button(按钮1); /添加一个按钮到容器上面 add(new Button(按钮2); ad
17、d(new Button(按钮3); add(new Button(按钮4); add(new Button(按钮5); pack(); /使界面上的元素在程序一运行之后,就全部显示出来。 public static void main(String args) FlowLayoutApp fla=new FlowLayoutApp(); /生成对象实例 /* * 例子3.6,本例演示BorderLayout布局(边界布局)的使用。这种布局会把容器上的组件按照 * 东西南北中各个方位进行排列。可以通过参数具体指定某个组件在东西南北中的哪一个方向。 * 通过这种布局,可以把容器细分为几个部分,以
18、便设置更好的界面。请注意并不是一定要东 * 西南北中五个方向都要放组件的。不足五个的组件同样可以分别被指定放在容器上东西南北 * 中的任何一个方位。自己可以尝试放置少于五个组件的情况。 */import javax.swing.JButton;import javax.swing.JFrame;public class BorderLayoutApp JFrame jf; JButton eastButton; JButton southButton; JButton westButton; JButton northButton; JButton centerButton; public B
19、orderLayoutApp() jf=new JFrame(这是一个演示BorderLayout布局的例子程序); eastButton=new JButton(东按钮); southButton=new JButton(南按钮); westButton=new JButton(西按钮); northButton=new JButton(北按钮); centerButton=new JButton(中央按钮); jf.add(eastButton,East); /注意:Frame容器的默认布局就已经是BorderLayout jf.add(southButton,West); jf.add(
20、westButton,North); jf.add(northButton,South); jf.add(centerButton,Center); jf.setVisible(true); jf.pack(); public static void main(String args) BorderLayoutApp bla=new BorderLayoutApp(); /*例子3.7,本例演示null布局(顺序布局)的使用。有时会用到null布局(即无布局管理器),程序员必须自己为容器中的组件设置大小和位置,因此其好处是可以随心所欲地设置组件的大小和位置得到自己想要的布局,但跨平台使用时,界
21、面可能发生变化,且程序编写和调试相对比较繁琐,示例如下。*/import javax.swing.JButton;import javax.swing.JFrame;public class NullLayoutApp JFrame jfr=new JFrame(null布局的使用示例); JButton b1=new JButton(open); JButton b2=new JButton(close); JButton b3=new JButton(ok); public NullLayoutApp() /构造函数,用于生成图形程序的界面 jfr.setSize(300,300); /设
22、置容器对象jfr的宽度和高度 jfr.setLayout(null); /设置为null布局。注意null四个字母全部小写! b1.setSize(80,20); /设置按钮b1的宽度和高度 b1.setLocation(10,30); /设置按钮b1在界面上的左上角的位置坐标 b2.setSize(90,40); b2.setLocation(40,60); b3.setSize(100,50); b3.setLocation(100,80); jfr.add(b1); /依次将每个组件添加到容器上 jfr.add(b2); jfr.add(b3); jfr.setResizable(tru
23、e); jfr.setVisible(true); /jfr.pack(); 注意:使用null布局之后,pack方法反而不需要使用了! public static void main(String args) NullLayoutApp nla=new NullLayoutApp(); /定义对象实例,调用构造函数生成界面 1、 Swing和AWT的区别2、 容器类:JFrame、JApplet、JDialog、JComponent普通组件类:JButton、JTextField、JTextArea、JLabel。辅助类:Color、Font、LayoutManager。下面的例子都将基于S
24、wing。3、 创建一个框架import javax.swing.JFrame;public class MyFrame public static void main(String args) JFrame frame = new JFrame(我的第一个界面); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); 4、 向框架中添加组件:import javax.swi
25、ng.JButton;import javax.swing.JFrame;public class MyFrame public static void main(String args) JFrame frame = new JFrame(我的第一个界面); JButton button= new JButton(按钮); frame.add(button); /JDK5之后允许直接如此调用将组件放在内容面板中 frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(
26、JFrame.EXIT_ON_CLOSE); frame.setVisible(true); 5、 布局管理器,此例开始尽量将界面设计放在构造函数中,便于类被复用等。/先看一个FlowLayout的例子import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.GridLayout;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;public
27、class MyFrame extends JFrame MyFrame() setLayout(new FlowLayout(FlowLayout.LEFT,10,20); add(new JLabel(学号:); add(new JTextField(8); add(new JLabel(性别); add(new JTextField(2); add(new JLabel(姓名:); add(new JTextField(8); public static void main(String args) MyFrame frame = new MyFrame(); frame.setSize
28、(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); 6、 GridLayout,写一个例子或改改上例试试看? 行数列数不能同时为0. 行列都不为0的情况下,行数是主导参数。7、 BorderLayout,写一个例子测试看看。8、 用JPanel(面板)作为子容器细化界面设计:import java.awt.*;import javax.swing.*;public class TestPanels
29、extends JFrame public TestPanels() / Create panel p1 for the buttons and set GridLayout JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(4, 3); / Add buttons to the panel for (int i = 1; i = 9; i+) p1.add(new JButton( + i); p1.add(new JButton( + 0); p1.add(new JButton(Start); p1.add(new JButton
30、(Stop); / Create panel p2 to hold a text field and p1 JPanel p2 = new JPanel(new BorderLayout(); p2.add(new JTextField(Time to be displayed here), BorderLayout.NORTH); p2.add(p1, BorderLayout.CENTER); / add contents into the frame add(p2, BorderLayout.EAST); add(new JButton(Food to be placed here), BorderLayout.CENTER); /* Main method
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1