当组件获得焦点、失去焦点时,都会触发FocusEvent事件。
组件可以使用requestFocusInWindow()方法获取焦点,可以使用transferFocus()向下一组件传递焦点。
要成为FocusEvent事件的监听器,需要实现FocusListener接口,即实现其中获得焦点时和失去焦点时的处理方法。
当按住、释放、敲击键盘上的键时,会触发KeyEvent事件。而事件的事件源是发生这个事件时,处于激活状态的那个组件。
KeyEvent类对象可以使用getKeyCode()方法获取键码值,还可以使用getKeyChar()方法获取键上的字符,具体常量随用随查吧。
要成为KeyEvent事件的监听器,需要实现KeyListener接口,即实现其中按住、释放和敲击时的处理方法。
窗口在被激活、撤销激活、正在关闭、关闭后、图标化、撤销图标化、打开共7种情况时,都会触发WindowEvent事件。
要成为WindowEvent事件的监听器,需要实现WindowListener接口,即实现其中这7种情况的处理方法。
对窗口的操作不仅触发单一的窗口事件:
当图标化窗口时,先执行windowIconified()即图标化的处理方法,再执行windowDeactivated()即撤销激活的处理方法。
当撤销图标化时,先执行windowDeiconified()即撤销图标化的处理方法,再执行windowActivated()即激活的处理方法。
当单击窗口上的关闭图标时,先执行windowClosing()方法,然后应保证窗口调用dispose()方法,这时才能继续触发窗口已经关闭的事件,执行windowClosed()方法。
在课本给的这个例子中,windowClosing()方法里直接退出了程序,所以不会继续执行任何语句。
Java提供的处理事件的接口中方法可能很多,如这个WindowListener接口中有7个方法,有时候用不到这么多,可以用Java提供的相关的适配器。WindowAdaper类就实现了WindowListener接口,所以可以让一个类直接继承它以作为监听器,而只需要覆写确实需要的方法。
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;
//监听KeyEvent和FocusEvent事件的监听器
public class Police implements KeyListener,FocusListener{
Police() {
// TODO Auto-generated constructor stub
}
//获得焦点
@Override
public void focusGained(FocusEvent e) {
JTextField jtf=(JTextField)e.getSource();
jtf.setText(null);//清空获得焦点的文本框
}
//失去焦点
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
//按下键盘上某个键
@Override
public void keyPressed(KeyEvent e) {
JTextField jtf=(JTextField)e.getSource();
//光标停留位置>=6,即左边输入了7字符
if(jtf.getCaretPosition()>=6)
jtf.transferFocus();//向后传递焦点,即焦点跳给下一组件
}
//松开键盘上某个键
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
//键盘按下又释放
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Win extends JFrame{
JTextField[] jtf=new JTextField[3];
Police pl;//监听器
JButton jb;
Win() {
this.setLayout(new FlowLayout());
pl=new Police();
for(int i=0;i<3;i++)
{
jtf[i]=new JTextField(7);
//虽说是同一个监听器
//但要当两种监听器用时还是要分别注册
jtf[i].addKeyListener(pl);
jtf[i].addFocusListener(pl);
this.add(jtf[i]);
}
jb=new JButton("确定");
this.add(jb);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
public class Main {
public static void main(String[] args) {
Win w=new Win();
w.setTitle("处理FocusEvent和KeyEvent事件");
w.setBounds(10,10,400,300);
}
}
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//WindowAdaper是实现了WindowListener接口的适配器类
//即继承这个适配器类,直接去覆写其中需要用的方法就够了
public class Boy extends WindowAdapter{
//窗口正在被关闭时
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口正在被关闭..");
System.exit(0);//直接结束程序
System.out.println("程序已结束,这句话没法输出了");
}
}
import javax.swing.JFrame;
public class MyFrame extends JFrame{
Boy by;
MyFrame(String s) {
super(s);
by=new Boy();
this.setBounds(100,100,400,200);
this.setVisible(true);
this.addWindowListener(by);
this.validate();//重新调整大小
}
}
public class Main {
public static void main(String[] args) {
new MyFrame("处理WindowEvent窗口事件");
}
}