第十三周课程总结
这一周我们学习了键盘事件及监听处理、单选按钮、菜单组件,同时对事件和监听器进行了回顾。
我们知道要想清楚事件处理,则首先应该知道事件的定义是什么,事件就是表示应该对象发生的状态变化,例如,每当一个按按钮时,实际上按钮的状态就发生了改变,那么此时就会产生一个事件,而如果想要处理此事件,则就需要事件的监听者不断地监听事件的变化,并且根据这些事件进行相应的处理。在Swing编程中,依然使用了最早的AWT的事件处理方式,所有的事件类都是EventObject类的子类。
一、监听适配器:
我们对事件处理的基本流程了解了,但是我们就会产生一个问题,也就是在我们操作的时候遇到的多种抽象方法的问题。如果现在我们只需要对某一部分进行监听,对于其它的部分我们不想去监听,但是我们会发现一旦实现了接口,我们就要实现他的所有抽象方法,这是一个很麻烦的事情,刚开始我写代码的时候也是这么想的。
package javabook; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; public class MyWindowListener implements WindowListener { @Override public void windowOpened(WindowEvent e) { System.out.println("窗口打开"); } @Override public void windowClosing(WindowEvent e) { System.out.println("窗口正在关闭"); System.exit(1); } @Override public void windowClosed(WindowEvent e) { System.out.println("窗口关闭"); } @Override public void windowIconified(WindowEvent e) { System.out.println("窗口最小化"); } @Override public void windowDeiconified(WindowEvent e) { System.out.println("窗口最小化恢复"); } @Override public void windowActivated(WindowEvent e) { System.out.println("窗口被选中"); } @Override public void windowDeactivated(WindowEvent e) { System.out.println("窗口被取消"); } }
import javax.swing.*; import java.awt.*; public class MyWindowListenertext { public static void main(String[] args) { JFrame f=new JFrame("窗体事件"); //将此窗体加入一个窗口事件监听器之中,这样监听器就可以根据事件进行处理 f.addWindowListener(new MyWindowListener()); f.setSize(400,300); f.setVisible(true); } }
但是我自己一开始认为这个问题是可以解决的,毕竟老师上课的时候也没有继承所有的抽象方法。因为老师上课的时候讲的不是自己不是很明白,回来之后按照老师讲的进行操作,也就自然而然发现了问题。然后我就仔细查看书本知识,在书本上有讲到要想解决这个问题,直接使用监听接口是不可能实现的,因为一个类如果要实现接口,那么就必须覆写它所有的抽象方法。那么解决的方法就是使用一个监听适配器。
使用监听适配器的方法就是在实现类和接口之间加一个抽象类用于过度,子类继承抽象类就可以根据自己的需要进行覆写,所以在整个事件处理中提供了很多的Adapter类,以方便用户进行事件处理的实现。简单的理解就是,你需要用水,但是水管里面的水一直不断的流,如果你在这个时候给它加一个水龙头,用于开关,这样你就可以根据自己的需要接水了,而适配器就相对于这个。
package javabooktow; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; public class Adapter { public static void main(String[] args) { JFrame f=new JFrame("监听适配器"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.out.println("系统关闭"); System.exit(1); } }); f.setSize(400,300); f.setVisible(true); } }
学习到这个知识点的时候,就应该开始去实现前面的知识了,然后我就按照老师说的尝试去做一个登陆界面,以前也做过这个登陆界面,但是以前仅仅是一个界面,没有实际的作用,但是结合这一次的知识就可以实现这个要求了,通过监听适配器去进行监听,从而实现按钮的作用。
package javabooktow; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.*; public class JavaAction implements ActionListener{ JFrame f; JLabel lab1,lab2,lab3; JButton but1,but2; JTextField tes; JPasswordField pass; public JavaAction() { f=new JFrame("登陆窗口"); lab1=new JLabel("用户名"); lab2=new JLabel("密码"); lab3=new JLabel(" "); tes=new JTextField(); pass=new JPasswordField(); but1=new JButton("登陆"); but2=new JButton("重置"); lab1.setBounds(20,20,80,40); lab2.setBounds(20,60,80,40); tes.setBounds(100,20,100,30); pass.setBounds(100,60,100,30); but1.setBounds(30,110,60,30); but2.setBounds(110,110,60,30); lab3.setBounds(100,170,40,30); f.add(lab1); f.add(lab2); f.add(tes); f.add(pass); f.add(but1); f.add(but2); f.add(lab3); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(1); } }); but1.addActionListener(this); but2.addActionListener(this); f.setSize(500,500); f.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==but1) { String username=tes.getText(); String fpass=new String(pass.getPassword()); if(username.equals("刘颖岚")&&fpass.equals("123456")) { lab3.setText("登陆成功"); }else { lab3.setText("登陆失败"); } }else if(e.getSource()==but2) { tes.setText(""); pass.setText(""); } } }
package javabooktow; public class JavaActiontest { public static void main(String[] args) { new JavaAction(); } }
二、键盘事件及监听处理:
在Swing的事件处理中也可以对键盘的操作进行监听,直接使用KeyListener接口即可。
在这个过程中就需要用到以前学习的知识this关键词,this关键词有很多的表示方法。
- 1.强调调用本类方法
- 2.表示类的成员属性
- 3.调用构造方法(注意:必须放在首行;不能循环调用;同时也不可以和super一起使用,super也是必须首行)
4.表示当前对象
在这里使用的是它的表示当前对象,将this加入到监听器中,表示将一个监听处理类加入到监听器中。
package javabooktow; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; class JavaKey extends JFrame { JTextArea area; JScrollPane scr; public JavaKey(){ area=new JTextArea(); scr=new JScrollPane(area); scr.setBounds(5,5,300,200); super.setTitle("键盘事件"); area.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { area.append("输入的内容是:"+e.getKeyChar()+"\n"); } }); super.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(1); } }); super.add(scr); super.setSize(400,300); super.setVisible(true); } }
package javabooktow; public class JavaKeytest { public static void main(String[] args) { new JavaKey(); } }
三、菜单组件
当一个界面出现许多按钮时,可以利用菜单进行统一的管理和布局,这样可以让界面的功能更加的丰富,布局也更加的简洁。为此老师带领我们在上课时间一起写了一个简易的记事本,慢慢的让我们实现前面所学习的知识,并且进行整合应用。
JMenu和JMenuBar
在Java中要实现此类菜单,则可以使用JMenu组件,不过,如果要使用JMenu则首先了解JMenuBar组件。JMenuBar组件的功能是用来摆放JMenu组件,当建立完多个JMenu组件之后,需要通过JMenuBar组件来将JMenu组件加入到窗口中。