ListenerAbate.javaimport java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;/**
 * 
 * @author lnx
 * 专为监听器失效原因查找用
 * 
 * 动作:按下右方向键可增加并变换数字,
 *       按下左方向键显示出重新开始的按扭,
 *       点击重新开始按扭,可重新回到0到始。
 * 
 * 问题如下:
 *     1、为何开始时得按两下右方向键才开始增加?
 *     2、为何在按下重新开始后界面是重新了,可是好像按键的监听器就失效了,
 * 而在缩小再放大窗口后就又能恢复监听了。这是为什么??
 */public class ListenerAbate{ public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,300);
JButton replayButton= new JButton("重新开始");
replayButton.setVisible(false);
StringJPanel stringJPanel = new StringJPanel();
Controller controller = new Controller(replayButton,stringJPanel);

replayButton.addActionListener(controller);
frame.add(stringJPanel);
frame.add(replayButton,BorderLayout.SOUTH);
frame.addKeyListener(controller);
frame.setVisible(true);
}}//*************************************************************************************
class Controller extends KeyAdapter implements ActionListener{
private JButton replayButton;
private StringJPanel stringJPanel; 
private int count;
public Controller (JButton replayButton,StringJPanel stringJPanel) {
this.replayButton = replayButton;
this.stringJPanel = stringJPanel;
count = 0;
} public void actionPerformed(ActionEvent e) {
System.out.println(" Controller's actionPerformed ");
this.replayButton.setVisible(false);
replay();
} private void replay() {
count = 0;
stringJPanel.display(count++);
}

public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
super.keyPressed(e);
System.out.println("Controller 's KeyEvent");
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT: 
stringJPanel.display(count++);
break;
case KeyEvent.VK_LEFT:
replayButton.setVisible(true);
break;
}
}
}
//****************************************************************
class StringJPanel extends JPanel  { private int count;

public StringJPanel () {
count = 0;
}

public void display(int count) {
this.count = count;
repaint();
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setFont(new Font(null,Font.BOLD,80));
g.drawString("" + count, count*20 + 10,150);
}

}