监听器类是特意为创建一个GUI组件而设计的监听器对象.监听器类是不被其他应用程序所共享的.正确的做法是将它作为一个内部类定义在框架类中.
可以使用匿名内部类简化内部类监听器.匿名内部类是没有名字的内部类.
例如
public ControlCircle(){
jbtEnlage.addActionListener(
new EnlargeListener());
}
class EnlargeListener implements ActionListener{
public void actionPerformed(ActionEvent e)
{
canvas.enlarge();
}
}
可以替换为
public ControlCircle(){
jbtEnlarge.addActionListener(
new AciotnListener(){
public void actionPerformed(AciotnEvent e){
canvas.enlarge();
}
}
);
}
匿名内部类的语法如下:
new SuperClassName/InterfaceName(){
//
//
}
匿名内部类必须总是扩展父类或实现接口,但是不能有显式的extends或implements语句
匿名内部类必须事先父类或者接口中的所有抽象方法
匿名内部类总是使用父类的无参构造方法来创建实例
import javax.swing.*;
import java.awt.event.*;
public class AnonymousListenerDemo extends JFrame{
public AnonymousListenerDemo(){
JButton jbtNew = new JButton( "New" );
JButton jbtOpen = new JButton( "Open" );
JButton jbtSave = new JButton( "Save" );
JButton jbtPrint = new JButton( "Print" );
JPanel panel = new JPanel();
panel.add(jbtPrint);
panel.add(jbtSave);
panel.add(jbtOpen);
panel.add(jbtNew);
add(panel);
jbtNew.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
System. out .println( "Process new" );
}
}
);
jbtOpen.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
System. out .println( "Process open" );
}
}
);
jbtPrint.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
System. out .println( "Process print" );
}
}
);
jbtSave.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
System. out .println( "Process save" );
}
}
);
}
public static void main(String[] args)
{
JFrame frame = new AnonymousListenerDemo();
frame.setTitle( "AnonymousListenerDemo" );
frame.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );
frame.setLocationRelativeTo( null );
frame.pack();
frame.setVisible( true );
}
}
也可以只创建一个监听器,将这个监听器注册给按钮,让后让监听器检测出事件源.对于每种事件写不同的执行方法
可修改为:
ButtonListener listener = new ButtonListener();
jbtNew.addActionListener(listener);
jbtSave.addActionListener(listener);
jbtOpen.addActionListener(listener);
jbtPrint.addActionListener(listener);
class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource() == jbtNew)
{
System. out .println( "Process new" );
}
else if(e.getSource() == jbtSave)
{
System. out .println( "Process save" );
}
else if(e.getSource() == jbtOpen)
{
System. out .println( "Process open" );
}
else if(e.getSource() == jbtPrint)
{
System. out .println( "Process print" );
}
}
}
窗口事件:
windows类或者windows任何子类都可能触发WindowEvent。JFrame是Windows的子类,因此也可以触发WindowEvent
激活窗口,关闭窗口,正在关闭窗口,变成非活动的窗口,最小化窗口,还原窗口或打开窗口。
import java.awt.event.*;
import javax.swing.*;
public class TestWindowEvent extends JFrame{
public static void main(String[] args){
TestWindowEvent frame = new TestWindowEvent();
frame.setTitle( "TestWindowEvent" );
frame.setSize(220,80);
frame.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public TestWindowEvent(){
addWindowListener( new WindowListener() {
public void windowDeiconified(WindowEvent event)
{
System. out .println( "Window deiconified" );
}
public void windowIconified(WindowEvent event){
System. out .println( "Window iconified" );
}
public void windowActivated(WindowEvent evnet){
System. out .println( "Window activated" );
}
public void windowDeactivated(WindowEvent event){
System. out .println( "Window deactivated" );
}
public void windowOpened(WindowEvent event){
System. out .println( "Window opened" );
}
public void windowClosing(WindowEvent event){
System. out .println( "Window closing" );
}
public void windowClosed(WindowEvent event){
System. out .println( "Window closed" );
}
}
);
}
}
监听器接口适配器:
因为WindowListener接口中的方法是抽象的,所以使用时必须事先所有方法。为了方便,java提供方便适配器的支持类。它提供监听器中所有方法的默认实现。每个XListener的方便监听器适配器命名为XAdapter.
这样如果只对激活窗口事件感兴趣,使用WindowAdapter可以简化前面的例子。
import java.awt.event.*;
import javax.swing.*;
public class AdapterDemo extends JFrame{
public static void main(String[] args){
AdapterDemo frame = new AdapterDemo();
frame.setSize(220,80);
frame.setLocationRelativeTo( null );
frame.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );
frame.setTitle( "AdapterDemo" );
frame.setVisible( true );
}
public AdapterDemo(){
addWindowListener( new WindowAdapter(){
public void windowActivated(WindowEvent event){
System. out .println( "Window activated" );
}
});
}
}