/**
   @version 1.30 2000-06-03
   @author Cay Horstmann
*/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();
   }
}/**
   A frame with a panel for sketching a figure
*/
class SketchFrame extends JFrame
{
   public SketchFrame()
   {
      setTitle("Sketch");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);      // add panel to frame      SketchPanel panel = new SketchPanel();
      Container contentPane = getContentPane();
      contentPane.add(panel);
   }   public static final int DEFAULT_WIDTH = 300;
   public static final int DEFAULT_HEIGHT = 200;  
}/**
   A panel for sketching with the keyboard.
*/
class SketchPanel extends JPanel

   public SketchPanel()
   {  
      last = new Point2D.Double(100, 100);
      lines = new ArrayList();
      KeyHandler listener = new KeyHandler();
      addKeyListener(listener);
      setFocusable(true);
   }   /**
      Add a new line segment to the sketch.
      @param dx the movement in x direction
      @param dy the movement in y direction
   */
   public void add(int dx, int dy)
   {  
      // compute new end point
      Point2D end = new Point2D.Double(last.getX() + dx,
         last.getY() + dy);      // add line segment
      Line2D line = new Line2D.Double(last, end);
      lines.add(line);
      repaint();      // remember new end point
      last = end;
   }   public void paintComponent(Graphics g)
   {  
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D)g;      // draw all lines
      for (int i = 0; i < lines.size(); i++)
         g2.draw((Line2D)lines.get(i));
   }   private Point2D last;
   private ArrayList lines;为什么我同时按shift键,向下键,向右键的时候非反应,而按shift键,向下键和一个其他非方向键的时候会有反应?

解决方案 »

  1.   

      KeyHandler 应该是监听有问题吧   键盘冲突  应该不可能
      

  2.   

    KeyHandler的代码呢?应该是你的监听器内部逻辑判断的问题
      

  3.   

    巧了,昨晚我刚看到那章,把这段代码输了一遍,运行了一下。3楼的很有经验,没看到源码就能猜出一二。源码中
              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);
    可以看出要么按向下键,要么按向右键,要么按其他两个方向键,即四选一,所以同时按shift键,向下键,向右键的时候非反应。而其它非方向键因为未定义,所以按shift键,向下键和一个其他非方向键的时候会有反应。