关于为图形界面添加接口和事件监听机制的一点想法
在讲接口之前简单说一下登录界面实现的过程吧,毕竟不是很熟悉权当复习了:
一、首先你得有一堆已经可以用来生成登录界面的代码。
这部分代码还是有点难度的(反正对我这个菜鸡挺难),不过后来多次的实现我逐渐记下了这个顺
序。
1. 首先要做的是引入一系列SWING,AWT组件,当然这个过程可以用“ctrl+o”实现,
做一步用一步即可;
2.然后就是开始创建一个窗体:JFrame frame=new JFrame();
3. 接着设置这个窗体的属性。大致的顺序依次为:标题,大小,显示位置,关闭操作
(“初标大显闭”)
eg:
JFrame frame=new JFrame();
frame.setTitle("党课考试界面");//设置标题
frame.setSize(600,500);//设置大小
frame.setLocationRelativeTo(null);//显示位置
frame.setDefaultCloseOperation(3);//关闭操作
4.现在你已经有了一个具备上述属性的窗体,也就是说已经有了一个可以放东西的地方
了。但这还不够,就像一张空白的纸,不做点什么是没什么意义的。所以你应该想到的是给它加点有趣的
东西。
加上去的东西怎么放呢?没有规则的乱画是不好的,所以添加东西前有必要给窗体声明一下布
局了。最常用的布局有“流式布局”。具体的定义挺多的,我的理解就是:这种布局像流水一样,水满则
溢,也就是说只有在一行满了之后才会换行,中途如果没满是不可能换行的。
eg:FlowLayout f2=new FlowLayout(FlowLayout.CENTER);
frame.setLayout(f2);
5.然后接下来就是一些添加各种元素组件的时候了。标签元素(图片&文字),文本输入框,
密码输入框,按钮等等。有点跑题了,此处具体操作如下:
ImageIcon img =new ImageIcon("C:\\Users\\john\\Desktop\\tu\\1508305257974.
jpeg");
//实例化标签元素组件类的对象,显示img图标对象
JLabel heihei=new JLabel(img);
frame.add(heihei); //将heihei添加到窗体上
JLabel ctName=new JLabel("账号:");
frame.add(ctName);
JTextField zhName=new JTextField(20);
frame.add(zhName);
JLabel mName=new JLabel("密码:");
frame.add(mName);
JPasswordField mmName=new JPasswordField(20);
frame.add(mmName);
JButton button1=new JButton("登陆");
frame.add(button1);
JButton button2=new JButton("取消");
frame.add(button2);
6.最后的最后是很重要的一步,你创建好的东西能不能被看到就看这里了。
frame.setVisible(true);
二、接口?新世界的大门!
所谓的“接口”,其实可以理解为通向新世界的大门。
你把每一扇门都搬到程序中,你就有了让程序进入新世界的可能性。
(1) java的库中已经给了我们种类繁多的接口,负责链接不同的功能。当我们需要某一个接口时,
只需要
public 类名 implement 接口1名,接口2名....{}
即可。(重要的事情说三遍:类的继承extends 接口的继承implements
类的继承extends 接口的继承implements
类的继承extends 接口的继承implements)
当然,除了直接用已经存在的接口,我们也可以自己去开辟一些新的东西,也就是自己去造一道
门走向新的地方。此时我们需要自己来定义接口。
格式: public interface接口名 extends 另一个接口名{ /
public static final 数据类型 数据名= ;
public abstract 返回类型 方法名(数据类型 数据);
}//是的定义了名字就可
PS:1.自己的接口还可以再接上别的接口?? (门里有门,不可以吗?)
2.定义的方法必须要说明是abstract,而且有名字就好。(毕竟造一道门没必要告诉人怎
么走路对吧,有个门就行了)
3.为什么数据的类型前必须有个static final呢?因为门上有什么花纹是造门的人当时就
已经设计好的了,一般是不允许改变的。所以用static来限制;final是说它已经是最后一层数据了,是
不能再被继承了。(也就是这个数据不能被覆盖,但是接口是可以继承的。接口本来就是用来继承的)
4.接口不能用来实例化对象,它就是个抽象的东西。
而且访问修饰符只有public。因为如果父类都是protected或者别的类型,你让子类怎么
愉快地玩耍?所以用的是public。
(2) 现在我们已经有了进入新世纪的可能性了,但是仅仅只是可能,要打开门就得先有钥匙。
配钥匙的过程————就是把接口的抽象方法重写得具体的过程。也就是在新的类里把函数体补全。
( 具体过程在下面监听机制中再实现
(3)监听机制:
首先得知道三个名词
1.事件源对象:容器组件,元素组件都可以成为事件源对象;
(动作发生在哪一个组件上,该组件就是事件源对象)
2.事件监听方法:捕获事件源对象上动作的方法
3.事件接口:处理事件监听方法捕获的动作
然后大致的操作步骤如下:
1. 为了接受并处理某类用户事件,组件得先注册相应的事件处理程序,这种程序也就是
Listener。 它是实现了对应监听程序接口的一个类。(嗯已经实现好了)例如:为了处理按钮上的
ActionEvent(类)事件,首先需要定义一个实现ActionListener接口的监听程序类。
注册的格式:组件名.addXXXXListener(XXXXListener)
例如:假设组件是个JButton型的a,想要注册动作类的事件。首先在“界面类”中这样写:
a.addActionListener(new HHHHH());
注:HHHHH必须是实现了ActionListener接口or继承了ActionListener的另一个类,
且方法体也写好了。
这样就算已经注册好了。
b.public HHHH{
public void actionPerformed(ActionEvent e){
public...希望实现的操作1,操作2...
}
}
这部分代码是在“监听机制类”中写的,做的就是发生了e这个事件时就会触发操作,是
不是很神奇!
c.一开始学习可能会在思考上有个难点,就是怎么样把这个动作监听的东西和被监听的东
西联系起来?其实a的那一行已经已经帮我们处理好这个问题了,电脑内部怎么操作就不用操心了。
在上面的几步都完成之后,我们就有了一个完整的监听机制。
下面给出代码实例:
这部分代码做的是:在登录界面上输入账号和密码,然后点击登录按钮,根据输入的账号和密码进
行验证,如果正确则运行initUI12,显示新窗体并关闭登录窗体,如果错误initUI11显示错误窗体
public class ButtonListener implements ActionListener {
public JFrame a;
public JTextField b;
public JPasswordField c;
public void setJFrame(JFrame pp) {
a = pp;
}
public void setJText(JTextField pp) {
b = pp;
}
public void setJPass(JPasswordField pp) {
c = pp;
}
public void actionPerformed(ActionEvent e) {
String n = b.getText();
String m = new String(c.getPassword());
if (n.equals("123456") && m.equals("111111")) {
initUI12();//initUI12是登陆成功的界面
} else
initUI11();//initUI11是登陆失败的界面
}
然后在主界面类中,实例化ButtonListener并给登陆按钮注册这个监听方法,代码如下:
ButtonListener bl=new ButtonListener();
bl.setJFrame(frame);
bl.setJText(zhName);
bl.setJPass(mmName);
button1.addActionListener(bl);
代码很简单,就不过多赘述了
注:有时候给监听方法传递内容时需要用到图形化的函数。这部分函数是SWING或者AWT内已经提供
给我们的,有必要时可自行百度
谢谢观看。
THE END