监听器类是特意为创建一个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"
);
}
});
}
}