简述

FocusEvent

当组件获得焦点、失去焦点时,都会触发FocusEvent事件。

组件可以使用requestFocusInWindow()方法获取焦点,可以使用transferFocus()向下一组件传递焦点。

要成为FocusEvent事件的监听器,需要实现FocusListener接口,即实现其中获得焦点时和失去焦点时的处理方法。

KeyEvent

按住、释放、敲击键盘上的键时,会触发KeyEvent事件。而事件的事件源是发生这个事件时,处于激活状态的那个组件。

KeyEvent类对象可以使用getKeyCode()方法获取键码值,还可以使用getKeyChar()方法获取键上的字符,具体常量随用随查吧。

要成为KeyEvent事件的监听器,需要实现KeyListener接口,即实现其中按住、释放和敲击时的处理方法。

WindowEvent

窗口在被激活、撤销激活、正在关闭、关闭后、图标化、撤销图标化、打开共7种情况时,都会触发WindowEvent事件。

要成为WindowEvent事件的监听器,需要实现WindowListener接口,即实现其中这7种情况的处理方法。

对窗口的操作不仅触发单一的窗口事件:

当图标化窗口时,先执行windowIconified()即图标化的处理方法,再执行windowDeactivated()即撤销激活的处理方法。

当撤销图标化时,先执行windowDeiconified()即撤销图标化的处理方法,再执行windowActivated()即激活的处理方法。

当单击窗口上的关闭图标时,先执行windowClosing()方法,然后应保证窗口调用dispose()方法,这时才能继续触发窗口已经关闭的事件,执行windowClosed()方法。

在课本给的这个例子中,windowClosing()方法里直接退出了程序,所以不会继续执行任何语句。

适配器

Java提供的处理事件的接口中方法可能很多,如这个WindowListener接口中有7个方法,有时候用不到这么多,可以用Java提供的相关的适配器。WindowAdaper类就实现了WindowListener接口,所以可以让一个类直接继承它以作为监听器,而只需要覆写确实需要的方法。

代码1

Police.java

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

    }
}

Win.java

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);
    }

}

Main.java

public class Main {

    public static void main(String[] args) {
        Win w=new Win();
        w.setTitle("处理FocusEvent和KeyEvent事件");
        w.setBounds(10,10,400,300);
    }

}

运行1

java swing获得焦点 java获取焦点的事件_适配器

代码2

Boy.java

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("程序已结束,这句话没法输出了");
    }
}

MyFrame.java

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();//重新调整大小
    }
}

Main.java

public class Main {

    public static void main(String[] args) {
        new MyFrame("处理WindowEvent窗口事件");
    }

}

运行2

java swing获得焦点 java获取焦点的事件_java swing获得焦点_02

(关闭窗口后)

java swing获得焦点 java获取焦点的事件_键盘事件_03