Java学习笔记之Swing(一)
学习目标
- 了解Swing的基本开发过程。
- 掌握如何创建窗口、面板、标签和按钮。
- 掌握和熟练使用Swing中的事件。
Swing的第一个程序
import javax.swing.*;
public class Swing1 extends JFrame{
public Swing1 {
this.setLayout(null);//设置布局管理器
JLabel jl=new JLabel();//定义一个标签
jl.setText("第一个Swing程序"); //设置显示的文字
jl.setBounds(50,50,400,50); //设 置标签的大小和位置
this.add(jl); //将标签放到窗口中
this.setBounds(300,250,500,200); //设置窗口的大小和位置
this.setVisible(true); //设置窗口是可见的
}
public static void main(String args[]){
Swing1 s=new Swing1();
}
}
JFrame窗口类简介
在开发Swing程序中,通常是通过继承JFrame类来实现窗口的。在该类中具有包括定义窗口标题、标框,以及窗口的 大小和位置等众多方法。在介绍这些方法之前,先来介绍一下JFrame窗口类的构造器。JFrame窗口类具有四种构造器。
最常用的JFrame窗口类的构造器是无参构造器,使用该构造器将创建一 个初始不可见的新窗体。除此之外还有具有一个String类参数的构造器,使用该构造器能够在初始时就创建一个具有标题的新窗体。还有两种 需要给出图形配置参数的构造器,这两种构造器此处不进行介绍。
创建新窗口后,就可以通过JFrame窗口类的方法来设置新窗口。首先使 用无参构造器创建的是一个不可见的新窗体,所以要使用方法来将窗体 设置为可见的形式。在JFrame窗口类中定义了一个setVisible方法来设 置窗口的可见性,该方法具有一个布尔型参数,true表示可见,false表 示不可见。将初始状态下的窗口设置为不可见是有原因的,因为有很多 对窗口的操作需要在窗口不可见的状态下执行,从而setVisible方法通 过在程序的最后执行。
在JFrame窗口类中有个setTitle方法,该方法需要一个字符型参 数。使用setTitle方法可以设置窗口的名称;还有一个setBounds方法,该方法具有4个参数,前两个参数分别表示窗口位置的横坐标和纵坐标,后两个参数分别表示窗口大小的宽度和高度。 JFrame窗口类最重要的方法就是add方法,使用该方法可以将组 件添加到窗口中。除此之外,该类中常用的方法还有setResizable,使用该方法可是设置窗口是否允许调整大小。
JFrame类中还有一个重要的方法,即setDefaultCloseOperation.使用该方法可是设置单击关闭窗口时执行的动作。这里的动作包括四种情况:
- DO_NOTHING_ON_CLOSE:不执行任何动作;
- DIPOSE_ON_CLOSE:释放窗体对象;
- HIDE_ON_CLOSE: 隐藏窗体;
- EXIT_ON_CLOSE: 退出JVM。
注意:如果不对该值进行设置,默认的值为HIDE_ON_CLOSE,也就是默认情况下单击关闭按钮会隐藏窗口。
JPanel类
JPnael类与上面的JFrame类一样,都属于一个容器类。在正式介绍该类之前我们需要先介绍一下什么是容器。
Swing中的控件可以分为三类,顶层容器、非顶层容器和普通控件。JFrame就属于一个顶层容器。顶层容器是一种可以直接显示在系统桌面的控件,其他控件必须直接或间接的借助顶层容器来显示。顶层容器除了包括JFrame类外,还包括JWindow类和JDialog类。
JPnael类属于一个非顶层容器类。非顶层容器具有两面性,非顶层容器需要放到顶层容器中使用,对于顶层容器来说,非顶层容器只是属于一般的控件。当我们在非顶层容器中添加控件时,对这些控件而言,非顶层容器就属于一个容器。
JPnael面板类简介
JPanel类是一个非顶层容器类,它具有四种构造器,最常用的依然是无参构造器,使用有参构造器可以设置面板使用什么样的布局管理器和是否使用双缓冲。JPanel面板类具有一个添加控件的add方法,使用该方法可以将普通控件添加到面板中。getHeight和getWidth方法可以返回当前面板的高度和宽度。JPanel类中还有一个重要的setToolTipText方法,该方法具有一个字符串参数,该方法的作用是当鼠标指针停在面板上时显示文本内容,字符串指定的就是所要显示的文本。
JLabel标签类
标签是Swing中最基本的控件,它是一种非交互式的控件。JLabel有六个构造器:
标签构造器 | 说明 |
---|---|
public void JLabel() | 创建没有图像和标题的标签 |
public void JLabel(Icon image) | 创建具有图像的标签 |
public void JLabel(Icon image,int horizontalAlignment) | 创建具有图像和指定对齐方式的标签 |
public void JLanel(String text) | 创建指定文本的标签 |
public void JLable(String text,int horizontalAlignment) | 创建指定文本和指定对齐方式的标签 |
public void JLabel(String text,Icon image,int horizontalAlignment) | 创建指定文本、图像和指定对齐方式的标签 |
创建一个标签的程序如下:
import javax.swing.*;
//继承JFrame类
public class Swing8 extends JFrame
JLabel jl=new JLabel(); //定义构造器
public Swing8()
{
this.setTitle("创建标签");
jl.setText("这是一个标签"); jl.setVerticalAlignment(JLabel.CENTER);//设置标签垂直居中
jl.setHorizontalAlignment(JLabel.CENTER);//设置标签水平居中
this.add(jl); //将标签添加到窗口中
this.setBounds(300,250,300,200); //设置窗口的大小和位置
this.setVisible(true); //设置窗口是可见的
}
public static void main(String args[]) {
Swing8 s=new Swing8();
}
运行结果:
JButton按钮类
JButton类也有多个构造器,最常用的依然是无参构造器。在JButton按钮类中具有几个很常用的方法。其中setText方法是 来设置按钮上显示的文本,和其对应的是用getText方法来获取按 钮上显示的文本。在JButton按钮类中还有一个经常被使用,即setMnemonic方法,使用该方法可以设置按钮的助记符。助记符就是使用键盘中的Alt加该助记符就能起到相应的功能。
创建一个简单按钮的实例如下:
import javax.swing.*;
//继承JFrame类
public class Swing9 extends JFrame
{
JButton jb=new JButton(); //定义构造器
public Swing9()
{
this.setTitle("创建按钮");
jb.setText("这是一个按钮"); //设置按钮上显示的内容
jb.setMnemonic('a'); //设置按钮的助记符
this.add(jb); //将按钮添加到窗口中
this.setBounds(300,250,300,200); //设置窗口的大小和位置
this.setVisible(true); //设置窗口是可见的
}
public static void main(String args[]) {
Swing9 s=new Swing9();
}
编译运行上面的实例代码之后,创建出一个窗口,整个窗口中只有一个按钮,而且按钮沾满了整个窗口。当我们从键盘上按下Alt+A组合键时相当于点击了这个按钮。这就是助记符的作用。
Swing中的事件
事件是一种很好的用户和界面的交互手段。在事件的发生和响应的过程中需要两个对象,事件监听器和事件源。事件源就是我们常见的一些可交互的控件,例如按钮、文本框和窗口等。但是不同的控件是存在不同的事件的,事件信息被封装在事件对象 中。事件监听器是指实现专门的监听接口的类的对象。每一个事件都有 对应的监听接口,同时在该接口中给出了处理事件的方法。在编写监听 器时需要事件监听接口,同时实现其中的方法,在方法中编写触发事件 后执行的程序。在编写程序时,还需要将监听器注册给事件源,这样才能执行事件。
同一个事件源注册多个监听器:
同一个事件源可以同时注册多个监听器,这种情况下触发事件, 所有的监听器都将执行事件方法,对事件进行处理。
当为同一个事件源注册多个监听器时,监听器的执行顺序并不是 先注册先执行的顺序,而是先注册后执行的顺序来执行的。
实例代码:
import javax.swing.*;
public class Swing5 extends JFrame{
JButton jb=new JButton();
int i=0;//按钮被单击的次数
public Swing5(){
this.setTitle("创建按钮");
jb.setText("按钮按下了0次");
jb.setMnemonic('a');
this.add(jb);
//为按钮注册监听器
jb.addActionListener(new ActionListener() {
//触发事件时执行的方法
public void actionPerformed(ActionEvent e){
Swing5.this.jb.setText("按钮按下了"+(++i)+"次");
}
});
//为按钮注册第二个监听器
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Swing5.this.jb.setText("按钮按下了"+(++i)+"次");
}
});
this.setBounds(100,200,300,250);
this.setVisible(true);
}
public static void main(String args[]){
Swing5 s=new Swing5();
}
}
同一个监听器注册给多个事件源
同一个监听器注册给多个事件源的情况下,所有的事件源中的任 意一个触发事件都会通知监听器,并执行监听器中的事件处理方法。将一个监听器注册给多个事件源,从而不管是单击哪一个按钮,都将执行监听器方法。为了辨别是哪一个按钮被按下,在监听器方法中需要判断是哪一个按钮触发了事件,执行的效果是使另一个按钮的显示内容发生变化。
窗体获取和失去焦点事件
窗体中的所有事件都是使用WindowEvent类来表示。窗体获取和失去焦点事件,该事件是通过实现 WindowFocusListener监听接口实现的。
窗体打开、关闭和激活事件
要实现窗体打开、关闭和激活事件只需要实现WindowListener监听接口的监听器。
按钮事件
按钮时具有事件的,当我们单击按钮时就出发了按钮事件,即ActionEvent事件。如果我们希望按钮事件触发后执行我们指定的程序,我们需要为按钮添加动作事件监听器,并且需要为按钮注册动作事件监听器。编写动作事件监听器需要通过实现ActionListener监听接口来完成。
在ActionListener监听接口中只有一个actionPerformed方法,所以在动作事件监听器中只需要实现这个方法。我们可以将触发事件后需要执行的程序写在actionPerformed方法中。定义完监听器后,我们还需要向按钮注册该监听器,注册监听器可以通过addActionListener方法来完成。