import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
public class Sketch
{
  public static void main(String[] args)  {
   SketchFrame frame=new SketchFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.show() ;
  }  }  class SketchFrame extends JFrame
  {
    public SketchFrame()
    {
      setTitle("PlafTest");
       setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
      SketchPanel panel=new SketchPanel();
       Container contentPane=getContentPane();
       contentPane.add(panel);    }    public static final int DEFAULT_WIDTH=300;
     public static final int   DEFAULT_HEIGHT =200;
  } class SketchPanel extends JPanel
  {
   public SketchPanel()
    {
     last = new Point2D.Double(100, 100);     lines = new ArrayList();
      KeyHandler listener = new KeyHandler();     addKeyListener(listener);
     setFocusable(true);
    }
     public void add(int dx,int dy)
      {
         Point2D end=new Point2D.Double(last.getX()+dx,last.getY()+dy);
        Line2D line=new Line2D.Double(last,end);
        lines.add(line);
         repaint();
       last=end;
      }      public void paintrComponent(Graphics g)
      {
        super.paintComponent(g);
        Graphics2D g2=(Graphics2D)g;
      for(int i=0;i<lines.size();i++)
        g2.draw((Line2D)lines.get(i));      }     private Point2D last;      private ArrayList lines;      private static final int  SAMLL_INCREMENT=1;
      private static final int   LARGE_INCREMENT=5;      private  class KeyHandler implements KeyListener
      {
        public void keyPressed(KeyEvent event)
        {
         //System.out.print("guo");
          int keyCode=event.getKeyCode();
          int d;
          if(event.isShiftDown())
            d=LARGE_INCREMENT;
            else
              d=SAMLL_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)
        {
         //System.out.print("yan");
         }
        public void keyTyped(KeyEvent event)
        {
           char keyChar=event.getKeyChar();
          // System.out.print(keyChar);
           int d;
           if(Character.isUpperCase(keyChar))
           {
             d=LARGE_INCREMENT;
             keyChar=Character.toLowerCase(keyChar);
           }
           else
             d= SAMLL_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);        }
      }  }

解决方案 »

  1.   

    import java.awt.*;
    import java.awt.geom.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class Sketch
    {
      public static void main(String[] args)  {
       SketchFrame frame=new SketchFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.show() ;
      }  }  class SketchFrame extends JFrame
      {
        public SketchFrame()
        {
          setTitle("PlafTest");
           setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
          SketchPanel panel=new SketchPanel();
           Container contentPane=getContentPane();
           contentPane.add(panel);    }    public static final int DEFAULT_WIDTH=300;
         public static final int   DEFAULT_HEIGHT =200;
      } class SketchPanel extends JPanel
      {
       public SketchPanel()
        {
         last = new Point2D.Double(100, 100);     lines = new ArrayList();
          KeyHandler listener = new KeyHandler();     addKeyListener(listener);
         setFocusable(true);
        }
         public void add(int dx,int dy)
          {
             Point2D end=new Point2D.Double(last.getX()+dx,last.getY()+dy);
            Line2D line=new Line2D.Double(last,end);
            lines.add(line);
             repaint();
           last=end;
          }      public void paintrComponent(Graphics g)
          {
            super.paintComponent(g);
            Graphics2D g2=(Graphics2D)g;
          for(int i=0;i<lines.size();i++)
            g2.draw((Line2D)lines.get(i));      }     private Point2D last;      private ArrayList lines;      private static final int  SAMLL_INCREMENT=1;
          private static final int   LARGE_INCREMENT=5;      private  class KeyHandler implements KeyListener
          {
            public void keyPressed(KeyEvent event)
            {
             //System.out.print("guo");
              int keyCode=event.getKeyCode();
              int d;
              if(event.isShiftDown())
                d=LARGE_INCREMENT;
                else
                  d=SAMLL_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)
            {
             //System.out.print("yan");
             }
            public void keyTyped(KeyEvent event)
            {
               char keyChar=event.getKeyChar();
              // System.out.print(keyChar);
               int d;
               if(Character.isUpperCase(keyChar))
               {
                 d=LARGE_INCREMENT;
                 keyChar=Character.toLowerCase(keyChar);
               }
               else
                 d= SAMLL_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);        }
          }  }