天天看点

我的Java学习之路(二):简谈JFrame界面开发与事件监听机制

本次我将对JFrame的界面开发做简略讲解,同时引申出如何安装监听器,在点击某按钮后显示新的界面。

(一)制作一个简单的JFrame界面

我们以制作一个仿QQ登录界面为例,成果如下图:

我的Java学习之路(二):简谈JFrame界面开发与事件监听机制

首先,我们来考虑一下制作一个此界面需要的组件:

框架、文字(文字标签)、复选框、图片(图片标签)、文字编辑框、密码编辑框、登录按钮。

同时布局方式我们采用最简单的流式布局(即排满了一行再去排下一行)。

我们需要引用API文档中相应的包名以实现这些组件,即:

import javax.swing.JFrame;//窗体
import java.awt.FlowLayout;//流式布局
import javax.swing.ImageIcon;//图片
import javax.swing.JTextField;//文字编辑框
import javax.swing.JPasswordField;//密码编辑框
import java.awt.Dimension;//编辑框、按钮尺寸
import javax.swing.JLabel;//标签
import javax.swing.JButton;//按钮
import javax.swing.JCheckBox;//复选框
           

准备工作就绪,接下来开始创建一个符合我们想法的窗体以及进行流式布局的安排,代码如下:

public class login(){
   public void show()
	{
		JFrame loginJFrame = new JFrame();
		//创建窗体类
		loginJFrame.setSize(400,420);
		loginJFrame.setTitle("QQ");
		loginJFrame.setLocationRelativeTo(null);
		loginJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//窗体参数及特性(尺寸、名称、居中、程序关闭)
		
		FlowLayout layout = new FlowLayout();
		loginJFrame.setLayout(layout);
		//创建流式布局
           

值得一提的是,尺寸设置要在居中前,否则起不到居中的效果。

接下来,我们要往上面添加相应的组件。

我们需要为每个组件创建相应的对象,注意每次添加要引用

loginJFrame.add(组件对象名);

同时,还有一点要值得注意:图片是不能直接添加到窗体上的,需要先将图片添加到图片标签上,再将图片标签添加到窗体上。

代码如下:

ImageIcon picture = new ImageIcon("C:\\Users\\dell\\Desktop\\微信图片_20190616173720.png");
		//创建图片对象
		JLabel pictureshow = new JLabel(picture);
		//创建图片标签对象
		loginJFrame.add(pictureshow);
		//显示图片
		
		JTextField text = new JTextField();
		//创建文本框
		JPasswordField password = new JPasswordField();
		//创建密码框
		JButton button = new JButton("登录");
		//创建命令按钮
		 
		Dimension text1 = new Dimension(300,35);
		text.setPreferredSize(text1);
		//文本框尺寸
		Dimension password1 = new Dimension(300,35);
		password.setPreferredSize(password1);
		//密码框尺寸
		Dimension button1 = new Dimension(400,35);
		button.setPreferredSize(button1);
		//命令按钮尺寸
		
		JLabel text2 = new JLabel("注册账号");
		JLabel text3 = new JLabel("找回密码");
		JLabel text4 = new JLabel("记住密码");
		JLabel text5 = new JLabel("自动登录");
		
		
		JCheckBox checkbox1 = new JCheckBox();
		JCheckBox checkbox2 = new JCheckBox();
		//创建复选框对象
		
		loginJFrame.add(text);
		//显示文本框
		loginJFrame.add(text2);
		//显示注册账号
		
		loginJFrame.add(password);//显示密码框
		loginJFrame.add(text3);//显示找回密码
		loginJFrame.add(checkbox1);//显示复选框1
		loginJFrame.add(text4);//显示记住密码
		loginJFrame.add(checkbox2);//显示复选框2
		loginJFrame.add(text5);//显示自动登录
		loginJFrame.add(button);//显示命令按钮
		
		
		loginJFrame.setVisible(true);//设置可见
		}
           

关于图片的引用,这里声明一下:

右键点击图片,找到“属性”,找到里面图片的路径,将其复制到创建图片对象行代码末尾的括号里(需加双引号),路径中单个的“\”改为“\”,然后再用“\”分隔开,接着复制粘贴图片的全名(含图片格式尾缀)即可。

注意:最后要设置窗体可见!

接下来,创建主函数,代码如下:

public static void main(String[] args)
	{
		login loginshow = new login();
		loginshow.show();
	}
}
           

运行,即可得到文章开头的窗体示例。

(二)创建事件监听器

我们拟达成的效果是:在点开“登录”按钮后,会显示一个新的界面。

我们要做的是,在“登录”按钮上添加监听器。

具体在刚才给button按钮添加尺寸的下方进行创建,具体代码如下(新添加的代码,即创建监听器的代码进行了加粗):

ImageIcon picture = new ImageIcon("C:\\Users\\dell\\Desktop\\微信图片_20190616173720.png");
		//创建图片对象
		JLabel pictureshow = new JLabel(picture);
		//创建图片标签对象
		loginJFrame.add(pictureshow);
		//显示图片
		
		JTextField text = new JTextField();
		//创建文本框
		JPasswordField password = new JPasswordField();
		//创建密码框
		JButton button = new JButton("登录");
		//创建命令按钮
		 
		Dimension text1 = new Dimension(300,35);
		text.setPreferredSize(text1);
		//文本框尺寸
		Dimension password1 = new Dimension(300,35);
		password.setPreferredSize(password1);
		//密码框尺寸
		Dimension button1 = new Dimension(400,35);
		button.setPreferredSize(button1);
		//命令按钮尺寸

ImageIcon picture = new ImageIcon("C:\\Users\\dell\\Desktop\\微信图片_20190616173720.png");
		//创建图片对象
		JLabel pictureshow = new JLabel(picture);
		//创建图片标签对象
		loginJFrame.add(pictureshow);
		//显示图片
		
		JTextField text = new JTextField();
		//创建文本框
		JPasswordField password = new JPasswordField();
		//创建密码框
		JButton button = new JButton("登录");
		//创建命令按钮
		 
		Dimension text1 = new Dimension(300,35);
		text.setPreferredSize(text1);
		//文本框尺寸
		Dimension password1 = new Dimension(300,35);
		password.setPreferredSize(password1);
		//密码框尺寸
		Dimension button1 = new Dimension(400,35);
		button.setPreferredSize(button1);
		//命令按钮尺寸


        **QQButton qqbutton = new QQButton();
		button.addActionListener(qqbutton);
		//设置监听器**
		
		JLabel text2 = new JLabel("注册账号");
		JLabel text3 = new JLabel("找回密码");
		JLabel text4 = new JLabel("记住密码");
		JLabel text5 = new JLabel("自动登录");
		
		
		JCheckBox checkbox1 = new JCheckBox();
		JCheckBox checkbox2 = new JCheckBox();
		//创建复选框对象
		
		loginJFrame.add(text);
		//显示文本框
		loginJFrame.add(text2);
		//显示注册账号
		
		loginJFrame.add(password);//显示密码框
		loginJFrame.add(text3);//显示找回密码
		loginJFrame.add(checkbox1);//显示复选框1
		loginJFrame.add(text4);//显示记住密码
		loginJFrame.add(checkbox2);//显示复选框2
		loginJFrame.add(text5);//显示自动登录
		loginJFrame.add(button);//显示命令按钮
		
		
		loginJFrame.setVisible(true);//设置可见
		}
		
		JLabel text2 = new JLabel("注册账号");
		JLabel text3 = new JLabel("找回密码");
		JLabel text4 = new JLabel("记住密码");
		JLabel text5 = new JLabel("自动登录");
		
		
		JCheckBox checkbox1 = new JCheckBox();
		JCheckBox checkbox2 = new JCheckBox();
		//创建复选框对象
		
		loginJFrame.add(text);
		//显示文本框
		loginJFrame.add(text2);
		//显示注册账号
		
		loginJFrame.add(password);//显示密码框
		loginJFrame.add(text3);//显示找回密码
		loginJFrame.add(checkbox1);//显示复选框1
		loginJFrame.add(text4);//显示记住密码
		loginJFrame.add(checkbox2);//显示复选框2
		loginJFrame.add(text5);//显示自动登录
		loginJFrame.add(button);//显示命令按钮
		
		
		loginJFrame.setVisible(true);//设置可见
		}
           

注:QQButton是点击登录按钮后能显示界面新创建的一个窗体显示类。

我们打开QQButton的源代码,发现:

public void addActionListener(ActionListener l) {
        listenerList.add(ActionListener.class, l);
    }
           

接着打开第二行中ActionListener的源代码,发现:

public interface ActionListener extends EventListener {

    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e);

}
           

interface是一个借口,它来作为一个媒介,不能创建对象,只有方法名,没有方法体,实现接口需要重写所有的方法。

extends是继承,即子类可以继承父类的public protected关键字下的全部属性,方法。

关于继承,将在下一篇文章中写到。

在新的QQButton类,我们添加以下几个类名:

import java.awt.event.ActionListener;//动作监听器类
import javax.swing.JFrame;//新窗口
import java.awt.FlowLayout;//流式布局
import javax.swing.ImageIcon;//添加图片
import javax.swing.JLabel;//标签
import java.awt.event.ActionEvent;//动作事件类
           

然后还是,为了按下登录按钮后,能产生一个新的界面,我们按老方法创建一个窗体,代码如下:

public class QQButton implements ActionListener {
//为了实现接口,需添加关键字implements。
	
	
	
	
	public void actionPerformed(ActionEvent n){
		System.out.println("登录成功!");
		JFrame jframe = new JFrame();
		jframe.setTitle("QQ");
		jframe.setSize(200, 240);
		jframe.setDefaultCloseOperation(3);
		jframe.setLocationRelativeTo(null);
		jframe.setVisible(true);
		//设置新窗体
		
		FlowLayout flow = new FlowLayout();
		jframe.setLayout(flow);
		//新窗体流式布局
		
		ImageIcon icon = new ImageIcon("C:\\Users\\dell\\Desktop\\Adobe\\微信图片_20190630000514.jpg");
		JLabel jlabel = new JLabel(icon);
		jframe.add(jlabel);
		//添加图片
		}
}

           

OK,运行程序,就会出现如片头所示图片的效果了。

归根结底,为了实现新的界面,就是在对应的按钮处添加动作监听器,然后在新的实现接口类中把接口中的方法进行实现并定义出新的窗体或命令,其中需用到继承的知识,我会在下篇文章中简要讲解。

2019.06.29
                                                                                                       笔者于湖南长沙