你应该把这个SketchPanel用到例子里去看看执行效果,就更容易知道它的执行顺序,这个类的主要作用是允许操作者利用键盘上的上下左右键(或者J,K,L,H)和SHIFT键配合在面板上画图
你可以看看结果:
TestPanel.java的内容:import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;class SketchPanel extends JPanel 
{
  private Point2D start;
  private ArrayList lines;  private static final int SMALL_INCREMENT=1;
  private static final int LARGE_INCREMENT=5;  public SketchPanel()
  {
    start=new Point2D.Double(100,100);
    lines=new ArrayList();
    KeyHandler listener=new KeyHandler();
    addKeyListener(listener);
  }  public boolean isFocusable()
  {
   return true;
  }  public void add(int dx,int dy)
  {
    Point2D end=new Point2D.Double(start.getX()+dx,start.getY()+dy);    Line2D line=new Line2D.Double(start,end);
    lines.add(line);
    repaint();    start=end;
  }  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    Graphics2D g2=(Graphics2D)g;    for(int i=0;i<lines.size();i++)
      g2.draw((Line2D)lines.get(i));
  }  private class KeyHandler implements KeyListener
  {
    public void keyPressed(KeyEvent event)
    {
      int keyCode=event.getKeyCode();      int d;
      if(event.isShiftDown())
        d=LARGE_INCREMENT;
        else
          d=SMALL_INCREMENT;      if(keyCode==KeyEvent.VK_LEFT) add(-d,0);
      else if(keyCode==KeyEvent.VK_RIGHT) add(d,0);
      else if(keyCode==KeyEvent.VK_UP) add(0,-d);
      else if(keyCode==KeyEvent.VK_DOWN) add(0,d);
    }    public void keyReleased(KeyEvent event){};    public void keyTyped(KeyEvent event)
    {
      char keyChar=event.getKeyChar();      int d;
      if(Character.isUpperCase(keyChar))
      {
        d=LARGE_INCREMENT;
        keyChar=Character.toLowerCase(keyChar);
      }
        else
          d=SMALL_INCREMENT;      if(keyChar=='h') add(-d,0);
      else if(keyChar=='l') add(d,0);
      else if(keyChar=='k') add(0,-d);
      else if(keyChar=='j') add(0,d);    }
  }
  
}public class TestPanel extends JFrame
{
 TestPanel()
 {
  super("Test");
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  SketchPanel sp=new SketchPanel();
  getContentPane().add(sp);
 }
 
 public static void main(String[] args)
 {
  TestPanel tp=new TestPanel();
  tp.setSize(200,200);
  tp.show();
  }
}
对于isFocusable(),它是属于JPanel的超类JComponent的一个方法,它的作用是判断容器(对于此例来说就是JPanel)是否可以获得焦点,因为只有JPanel的对象获得了焦点才可以画点或线,所以
它必不可少,它由paintComponent()来调用,所以我们在例子里看不到它的显式调用