抽象类WindowAdapter是变压器模式的一个例子 抽象类WindowAdapter是为接受视窗的事件而准备的。此抽象类内所有的方法都是空的。 使用此类可以很方便地创立listener对象。置换(Override)你所感兴趣的那个事件所对应的方法。 如果你不使用此抽象类,那么你必然规律要实现WindowsListener接口,而那样你就不得不实现所有接口中的方法, 即便是你不需要的事件所对应的方法,你也要给出一个空的方法,而这显然不方便。
显然,抽象类WindowAdapter的目标接口可以选得与源接口一样,而不影响效果。 这就解释了为什么目标接口不出现在WindowAdapter类图(见下面)里。
图3. 本例子SwingUI类与WindowAdapter实例变压器模式的类图定义 SwingUI类的代码如下。
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
class SwingUI extends JFrame implements ActionListener
{
JLabel text, clicked;
JButton button, clickButton;
JPanel panel;
private boolean m_clickMeMode = true;
Public SwingUI()
{
text = new JLabel("我很高兴!");
button = new JButton("理我");
button.addActionListener(this);
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBackground(Color.white);
getContentPane().add(panel);
panel.add(BorderLayout.CENTER, text);
panel.add(BorderLayout.SOUTH, button);
}
public void actionPerformed(ActionEvent event)
{
Object source = event.getSource();
if (m_clickMeMode)
{
text.setText("我很烦!");
button.setText("别理我");
m_clickMeMode = false;
}
else
{
text.setText("我很高兴!");
button.setText("理我");
m_clickMeMode = true;
}
}
public static void main(String[] args)
{
SwingUI frame = new SwingUI();
frame.setTitle("我");
WindowListener listener = new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
};
frame.addWindowListener(listener);
frame.pack();
frame.setVisible(true);
}
}
代码清单7. SwingUI类的源代码。红色的代码就是使用WindowAdapter的无名内部类。 显然,由于无名内部类是继承自WindowAdapter抽象类,因此只需置换(override)掉我们需要的方法, 即windowClosing()而不必操心WindowListener的其它方法。
本例子在运行时的样子:
图4. SwingUI类在运行时的样子。单击命令键“理我”就变成下图的样子。
图5. 再单击命令键“别理我”就会回到前图的样子。
