Swing是一种开发桌面程序的技术,是Sun公司推出的图形用户接口工具包
1.简单的Swing程序
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Swing extends JFrame {
public Swing() {//定义构造器,分配内存空间
this.setLayout(null);//设置布局管理器,空布局
JLabel j1 = new JLabel();//定义一个标签
j1.setText("我的第一个Swing程序");//设置显示的文字
j1.setBounds(50,50,400,50);//设置标签的大小和位置
this.add(j1);//将标签放到窗口中
this.setBounds(300,250,500,200);//设置窗口的大小和位置
this.setVisible(true);
}
public static void main(String[] args) {
Swing s = new Swing();
}
}
2.JFrame窗口类
窗口是一个容器,有四类构造器:JFrame(常用,无参构造器,初始不可见)、String类参数构造器(具有标题的窗体)等
方法:
(1)setTitle():需要一个字符型参数,设置窗口名称;
(2)setBounds():有4个参数,前两个参数分别表示窗口位置的横坐标和纵坐标,后两个参数表示窗口的高度和宽度。
*(3)add():最重要的,将组件添加到窗口中;
(4)setViseible():设置窗口的可见性,该方法具有一个布尔型参数。默认false,因为很多对窗口的操作需要再窗口不可见的状态下执行,从而该方法通常最后执行。
(5)setResizable():设置创建的窗口是否可以调整大小,默认是能调整的(true);
(6)setUndecoracted(true):将窗口的边框和标题栏去掉
(7)setIconImage():在标题中出现图片
(8)setDefaultCloseOperation():设置当关闭窗口时所执行的动作:
do-nothing-on-close:不执行任何动作
dispose_on_close:释放窗口对象
hide-on-close:隐藏窗体(默认)
exit-on-close:推出jvm
例子:
直接调用JFrame类的构造器
import javax.swing.JFrame;
public class Swing {
public static void main(String[] args) {
JFrame f = new JFrame();//创建JFrame类对象
f.setTitle("直接使用JFrame窗口类");//设置窗口名称
f.setBounds(300, 250, 300,200);//设置窗口大小和位置
f.setVisible(true);//可视
}
}
继承JFrame:
import javax.swing.JFrame;
public class Swing extends JFrame {
public Swing() {//定义构造器
this.setTitle("通过继承创建窗口");
this.setBounds(300,250,300,200);
this.setVisible(true);
}
public static void main(String[] args) {
Swing s = new Swing();
//定制化
}
}
给标题添加图片
import java.awt.Image;
import javax.swing.JFrame;
public class Swing extends JFrame{
public Swing() {
Image i=this.getToolkit().getImage("Image/star.jpg");//指定一张图片
this.setIconImage(i);//为标题添加图片
this.setVisible(true);
}
public static void main(String[] args) {
Swing s = new Swing();
}
}
3.JPanel类
3.1容器介绍:
Swing 中控件分为3类:顶层容器、非顶层容器、普通控件
顶层容器(如JFrame)是可以直接显示在系统桌面上的控件,其他控件必须直接或间接借助顶层容器进行显示。
非顶层容器(如JPanel)具有两面性,需要放到顶层容器中使用。
普通控件(如按钮、文本框)只能在容器中显示
5.2JPanel面板类
(1)使用有参构造器可以在初始时设置面板采用什么样的布局管理器和是否使用双缓冲
(2)作用:作为非顶层容器来添加普通控件,搭建子界面
(3)add():将普通控件添加到面板中,
(4)getHeight()和getWidth():分别是返回当前面板的高度和宽度
(5)setToolTipText():有一个字符串参数,当鼠标停留在面板上时显示文本,字符串内容就是要显示的内容。
5.3JLabel标签类:主要在界面上为用户提供一些提示性的信息。有6个构造器
5.4JButton按钮类:触发动作事件
(1)setText():设置按钮上显示的文本 getText():获取按钮上显示的文本
(2)按钮动作事件:
单击按钮时触发动作事件:ActionEvent事件
触发后执行程序:添加并注册动作事件监听器:addActionListener();ActionListener监听接口只有一个actionPerformed(),将触发事件后要执行的程序都写在actionPerformed()中。其中有个ActionEvent参数,为指向按钮产生的动作事件对象的引用。
使用匿名内部类:
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JFrame;
public class test extends JFrame {
JButton j = new JButton();
int i = 0;
public test() {
// 创建一个按钮
this.setTitle("创建按钮");
// 定义一个表示按下次数的变量
j.setText("按钮按下了0次");
// 设置按钮的助记符(快捷键代替按钮):alt+a
j.setMnemonic('a');
this.add(j);
// 为按钮注册监听器
j.addActionListener(new ActionListener() {// 触发动作事件,执行的方法
public void actionPerformed(ActionEvent e) {
test.this.j.setText("按钮按下了" + (++i) + "次");
}
});
// 设置窗口的大小和位置
this.setBounds(300, 250, 300, 200);
// 设置窗口是可见的
this.setVisible(true);
}
public static void main(String[] args) {
test t = new test();
}
}
不使用匿名内部类实现动作事件监听的程序
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JFrame;
public class test extends JFrame implements ActionListener{
JButton j = new JButton();
int i = 0;
public test() {
// 创建一个按钮
this.setTitle("创建按钮");
// 定义一个表示按下次数的变量
j.setText("按钮按下了0次");
// 设置按钮的助记符(快捷键代替按钮):alt+a
j.setMnemonic('a');
this.add(j);
j.addActionListener(this);
// 设置窗口的大小和位置
this.setBounds(300, 250, 300, 200);
// 设置窗口是可见的
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
this.j.setText("按钮按下了"+(++i)+"次");
}
public static void main(String[] args) {
test t = new test();
}
}
6.Swing中的事件
(1)事件:一种很好的让界面和用户进行交互的手段。事件的发生和响应的过程需要以下两个。
(2)事件源:触发事件的控件
(3)监听器:实现专门的监听接口的类的对象,每一个事件都有对应的监听接口,同时在该接口中给出了处理事件的方法。
*不同的控件存在不同的事件,事件信息被封装在事件对象中。
监听器+事件监听接口——>同时实现其中的方法——>在方法中编写触发事件后执行的程序+将监听器注册给事件源,最后执行程序。
事件源和监听器之间是多对多的关系,一个事件源可以对应多个监听器,一个监听器可以为多个事件源服务。
例子:同一个事件源注册多个监听器
//同一个事件源注册多个监听器
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JFrame;
public class test extends JFrame {
JButton j = new JButton();
int i = 0;
public test() {
// 创建一个按钮
this.setTitle("创建按钮");
// 定义一个表示按下次数的变量
j.setText("按钮按下了0次");
// 设置按钮的助记符(快捷键代替按钮):alt+a
j.setMnemonic('a');
this.add(j);
// 为按钮注册监听器
j.addActionListener(new ActionListener() {// 触发动作事件,执行的方法
public void actionPerformed(ActionEvent e) {
test.this.j.setText("按钮按下了" + (++i) + "次");
}
});
//监听器的执行顺序是先注册后执行,而不是先注册先执行
j.addActionListener(new ActionListener() {// 触发动作事件,执行的方法
public void actionPerformed(ActionEvent e) {
test.this.j.setText("按钮按下了" + (++i) + "次");
}
});
// 设置窗口的大小和位置
this.setBounds(300, 250, 300, 200);
// 设置窗口是可见的
this.setVisible(true);
}
public static void main(String[] args) {
test t = new test();
}
}
同一个监听器注册给多个事件源
//同一个监听器注册给多个事件源
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Swing extends JFrame implements ActionListener{
JButton j = new JButton();//创建一个按钮
JButton j1 = new JButton();//创建第二个按钮
JPanel jp=new JPanel();//定义一个面板
int i = 0;//表示第一个按钮按下的次数的变量
int a=0;//表示第二个
//定义构造函数
public Swing() {
// 创建一个按钮
this.setTitle("创建按钮");
// 定义一个表示按下次数的变量
j.setText("按钮按下了0次");
j1.setText("按钮按下了0次");
// 设置按钮的助记符(快捷键代替按钮):alt+a
j.setMnemonic('a');
j1.setMnemonic('b');
jp.add(j);//将按钮添加到面板
jp.add(j1);
this.add(jp);//将面板添加到窗体中
j.addActionListener(this);//为按钮注册监听器
j1.addActionListener(this);
// 设置窗口的大小和位置
this.setBounds(300, 250, 300, 200);
// 设置窗口是可见的
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==j) {//如果事件源是第一个按钮
this.j.setText("按钮按下了"+(++i)+"次");//设置第一个按钮的显示内容
}else if(e.getSource()==j1) {//如果事件源是第二个按钮
this.j1.setText("按钮按下了"+(++a)+"次");//设置第二个按钮的显示内容
}
}
public static void main(String[] args) {
Swing s= new Swing();
}
}
7.窗体获取和失去焦点事件
当鼠标单击一个窗口时,这个窗口就获得了焦点。一个窗口同一时间只能有一个组件获得焦点。
this.addWindowFocusListener(this);//注册窗体获取和失去焦点事件
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class Swing extends JFrame implements WindowFocusListener {
public Swing() {
this.setTitle("窗体获取和失去焦点事件");
this.addWindowFocusListener(this);
this.setBounds(300, 300, 300, 300);
this.setVisible(true);
}
@Override
public void windowGainedFocus(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("窗体获取焦点");
}
@Override
public void windowLostFocus(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("窗体失去焦点");
}
public static void main(String args[]) {
Swing s = new Swing();
}
}
窗体打开、关闭和激活事件:
this.addWindowListener(this);// 注册窗体打开、关闭、激活事件
import java.awt.event.*;
import javax.swing.JFrame;
public class Swing extends JFrame implements WindowListener {
public Swing() {
this.setTitle("窗体获取和失去焦点事件");
this.addWindowListener(this);// 注册窗体打开、关闭、激活事件
this.setBounds(300, 300, 300, 300);
this.setVisible(true);
}
@Override
public void windowActivated(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("窗体被激活");
}
@Override
public void windowClosed(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("关闭窗体后");
}
@Override
public void windowClosing(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("关闭窗体");
}
@Override
public void windowDeactivated(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("窗体变为非激活");
}
@Override
public void windowDeiconified(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("从最小化状态变为正常状态");
}
@Override
public void windowIconified(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("从正常状态变为最小化状态");
}
@Override
public void windowOpened(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("窗体首次可见");
}
public static void main(String args[]) {
Swing s = new Swing();
}
}
end.