GUI(图形用户界面)为程序员提供图形界面,它最初的设计目的死为了程序员构建一个通用的GUI,使其能够在所有的平台上运行,但是Java 1.0 中的基础类AWT(抽象窗口工具箱)并没有达到这个要求,于是Swing出现了,它是AWT组建的增强组建,但是它并不能完全替代AWT,这两种组件需要同时出现在一个图形用户界面中。
Swing组件
原来的AWT组件来自java.awt包,当含有AWT组件的java应用程序在不同的平台上执行时,每个平台的GUI组件的显示会有所不同,但是在不同的平台运行Swing开发的应用程序时,就可以统一GUI组件的显示风格,因为Swing组件允许编程人员在跨平台时指定统一的外观和风格。
Swing组件通常被称为“轻量级组件”,因为它完全由java语言编写,而Java时不依赖于操作系统的语言,它可在任何平台上运行;相反,依赖于本地平台的组件称为“重量级 组件”,如AWT组件就是依赖本地平台的窗口系统来决定组件的功能、外观和风格。Swing组件具有以下特点:
-
轻量级组件
-
可插入外观组件
Swing包
为了有效的使用Swing组件,必须了解Swing包的层次结构和继承关系,其中比较重要的是Component类、Container类和JComponent类。其中这几个类的继承关系如下:
javax.swing.JComponent 继承自:
javax.awt.Container类继承自:
javax.awt.Component继承自:
java.lang.Object类
在Swing组件中大多数GUI组件都是Component类的直接子类或者间接子类,JComponent类是Swing组件各种特性的存放位置,这些组件的特性包括设定组件边界,GUI组件自动滚动等。
在Swing组件中最重要的是父类Container类,而Container类有两个重要的子类,分别为java.awt.Window and java.awt.Frame, 除了以往的AWT类组件会继承这两个类之外,现在的Swing组件也扩展了这两个类。
常用窗体
窗体作为Swing应用程序中的组件的承载体,处于非常重要的位置。Swing中常用的窗体包括JFrame和JDialog。
JFrame窗体
JFrame窗体是一个容器,它是Swing程序中各个组件的载体,可以将JFrame看作是承载着血Swing组件的容器。在开发应用程序时,可以通过继承java.swing.JFrame类创建一个窗体。在这个窗体中添加组件,同时为组件设置事件。
由于该窗体继承了JFrame类,所以它拥有“最大化”、“最小化”、和“关闭”等按钮
下面将详细讲解JFrame窗体在java应用程序中的使用方法。
JFrame在程序中的语法如下:
JFrame jf = new JFrame(title);
Container container = jf.getContentPane();
参数含义如下:
jf:JFrame类对象
container: Container类的对象,可以使用JFrame对象调用getContentPane()方法获取。
Swing组件的窗体通常与组件和容器有关,所以JFrame对象创建完成后,需要调用getContentPane() 方法将窗体转换为容器,然后在容器中添加组件或者设置布局管理器。
通常这个容器用来包含和显示组件。如果需要将组件添加至容器,可以使用来自Container类的add方法进行设置。例如:
container.add(new Button("按钮"));
在容器中添加组件后,也可以使用Container类的remove() 方法将这些组件从容器中删除,例如:
container.remove(new Button("按钮"));
下面的实例实现了JFrame对象创建一个窗体,并在其中添加一个组件。
package com.xsh;
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class Example1 extends JFrame { //创建一个类继承JFrame类
public void CreateJFrame(String title) { //定义一个CreateJFrame方法
JFrame jf = new JFrame(title); //实例化一个JFrame对象
Container container = jf.getContentPane(); //获取一个容器
JLabel jl = new JLabel("这是一个JFrame窗体"); //创建一个JLabel标签
jl.setHorizontalAlignment(SwingConstants.CENTER); //将标签位置设置为居中
jl.setForeground(Color.white); //设置JLabel的颜色
container.add(jl); //将标签添加到容器中
container.setBackground(Color.RED); //设置容器背景颜色
jf.setVisible(true); //是窗体可视
jf.setSize(300, 150); //设置窗体大小
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置窗体关闭方式
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Example1().CreateJFrame("这是我创建的第一个JFrame窗体。"); //主方法中调用JFrame()方法
}
}
其运行结果如下:
在上述例子中,Example1类继承了JFrame类,在CreateJFrame()方法中,实例化了JFrame对象。JFrame类的常用构造方法包括以下两种形式:
-
public JFrame().
- Public JFrame(String title).
JFrame类中的两种构造方法分别为无参的构造方法和有参的构造方法。
第一种形式的构造方法可以创建一个初始不可见、没有标题的新窗体;
第二种形式的构造方法在实例化该JFrame对象时可以创建一个不可见但是具有标题的窗体。
可以使用JFrame对象调用show()方法使窗体可见,但是该方法已经被系版本的JDK中的setVisible(true)方法取代。
同时可以使用setSize(int i, int j)方法设置窗体大小,其中x与y变量分别代表窗体的宽和高
创建窗体以后,需要给窗体一个关闭方式,可以调用setDefaultCloseOPeration()方法关闭窗体。Java为窗体关闭提供了多种方式,常用的有以下四种;
-
DO_NOTHING_ON_CLOSE
-
DISPOSE_ON_CLOSE)
-
HIDE_ON_CLOSE
-
EXIT_ON_CLOSE
JDialog
JDialog窗体是Swing组件中的对话框,它继承了AWT组件中java.awt.Dialog类。
JDialog窗体的功能是从另外一个窗体中弹出另外一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样。JDialog窗体实质上就是另一种类型的窗体,它与JFrame窗体类似,在使用时也需要调用getCOntentPane()方法将窗体转换成容器,然后在容器中 设置窗体的特性。
在应用程序中创建JDialog窗体需要实例化JDialog类,通常使用以下几个JDialog类的构造方法。
- public JDialog():创建一个没有标题和副窗体的对话框
- public JDialog(Frame f):创建一个指定父窗体的对话框,但是对话框没有标题
- public JDialog(Frame f, boolean model):创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题。
- public JDialog(Frame f, String title):创建一个指定标题和父窗体的对话框
- public JDialog(Frame f, String title, boolean model):创建一个指定标题,父窗体和模式的对话框
下面来看一个实例:
package com.xsh;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
class MyDialog extends JDialog{
private static final long serialVersionUID = 1L;
public MyDialog(MyFrame frame) {
super(frame,"第一个JDialog窗体", true); //实例化一个JDialog类对象,指定对话框的父窗体、窗体标题和类型
Container container = getContentPane(); //创建一个容器
container.add(new JLabel("这是一个JDialog对话框")); //在容器中添加标签
setBounds(100, 100, 200, 100); //设置容器的窗体大小,其中前两个值是设置对话框的位置,后两个值是设置对话框的大小
}
}
public class MyFrame extends JFrame { //创建新类,继承自JFrame
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyFrame(); //实例化MyFrame对象
}
public MyFrame() {
Container container = getContentPane(); //创建一个容器
container.setLayout(null);
JLabel jl = new JLabel("这是一个JFrame窗体"); //在窗体中设置标签
jl.setHorizontalAlignment(SwingConstants.CENTER); //将标签的文字至于标签中间的位置
container.add(jl); //将标签添加到容器中
JButton jb = new JButton("弹出对话框"); //定义一个按钮
jb.setBounds(10, 30, 100, 20); //设置按钮的大小
jb.addActionListener(new ActionListener() { //为按钮添加点击事件
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new MyDialog(MyFrame.this).setVisible(true); //使MyDialog窗体可见
//在点击事件中,完成了对话框的创建
}
});
container.add(jb);
container.setBackground(Color.white);
setSize(200,200);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setVisible(true);
}
}
在本实例中,为了使对话框父窗体弹出,定义了一个JFrame窗体,首先在该窗体中定义了一个按钮,然后为此按钮添加了一个点击事件。在点击事件中,我们使用了new MyJDialog().setVisible(true) 语句使对话框窗体可见,这样就实现了单机 按钮之后弹出 对话框的功能。
在MyDialog类中,由于它继承了JDialog类,所以可以在构造方法中使用super关键字调用JDialog构造方法。
在这里我们使用了 piublic JDialog(Frame f, String title, boolean model); 这种形式的构造方法,相应的设置了自定义的JFrame窗体以及对话框的标题和窗体类型。