面板中按钮事件响应后为什么方向键事件不能响应??

解决方案 »

  1.   

    迷宫面板
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;public class DirectionPanel extends JPanel
    {    private final int WIDTH=Maze.width, HEIGHT=Maze.height;   //迷宫大小 
       private final int WIDTH_RIGHT=100;
                       
       static final int JUMP = 20;      // 移动步幅,要和迷宫方格尺寸一致
       
       private final int IMAGE_SIZE = 20;
       private Maze maze;
       private ImageIcon up, down, right, left, currentImage;
       private int x, y;
       
      private JButton changeMaze;
      private JPanel tools;   public DirectionPanel()
       {  maze=new Maze();                          //创建迷宫类
        
          addKeyListener (new DirectionListener());      x = 20;                                  //移动图标初始位置
          y = 20;      up = new ImageIcon ("arrowUp21.gif");            //图标图片引用
          down = new ImageIcon ("arrowDown21.gif");
          left = new ImageIcon ("arrowLeft21.gif");
          right = new ImageIcon ("arrowRight21.gif");      currentImage = right;
                        
          setBackground (Color.white);
          setPreferredSize (new Dimension(WIDTH, HEIGHT));
          setFocusable(true);
       }
       
       public void changeMa()
       {maze=new Maze();
        x = 20;                                  //移动图标初始位置
        y = 20;
       currentImage = right;
       }public void paintComponent (Graphics page)
       {
          super.paintComponent (page);
          page.setColor(Color.GREEN);
          maze.drawMaze(page);
          currentImage.paintIcon (this, page, x, y);    }//键盘监听器,可以使用户在迷宫通道上移动箭头图标,利用Maze类的viable方法判断此坐标的特定方向是否可行
       

       private class DirectionListener implements KeyListener
       {
          public void keyPressed (KeyEvent event)
          {
             switch (event.getKeyCode())
             {
                case KeyEvent.VK_UP:
                   currentImage = up;
                   if(maze.viable(x,y,4)&&y>0)
                   y -= JUMP;
                   break;
                case KeyEvent.VK_DOWN:
                   currentImage = down;
                   if(maze.viable(x,y,2)&&y+20<HEIGHT)
                   y += JUMP;
                   break;
                case KeyEvent.VK_LEFT:
                   currentImage = left;
                   if(maze.viable(x,y,3)&&x>0)
                   x -= JUMP;
                   break;
                case KeyEvent.VK_RIGHT:
                   currentImage = right;
                   if(maze.viable(x,y,1)&&x<WIDTH-20)
                   x += JUMP;
                   break;
                case KeyEvent.VK_S:
                   changeMa();
                   break;   
             }         repaint();
          }      public void keyTyped (KeyEvent event) {}
          public void keyReleased (KeyEvent event) {}
       }
    }主面板
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class mainPanel extends JPanel{
    private final int MAIN_WIDTH=MazeCreator.widthM*DirectionPanel.JUMP,MAIN_HEIGHT=MazeCreator.heightN*DirectionPanel.JUMP;
    private final int TOOLS_WIDTH=80;
    private JButton changeMaze;
    private JPanel tools,MainPanel;
    private DirectionPanel MazePanel;    public mainPanel() {tools=new JPanel();
        tools.setBackground(Color.lightGray);
        tools.setOpaque(true);
        
            
        changeMaze=new JButton();
        changeMazeListener changeM=new changeMazeListener();
        changeMaze.addActionListener(changeM);    
        tools.add(changeMaze);
        MazePanel=new DirectionPanel();    add(tools);
        add(MazePanel);
        
      setPreferredSize (new Dimension(MAIN_WIDTH+TOOLS_WIDTH, MAIN_HEIGHT));
        }
        
       private class  changeMazeListener implements ActionListener
       {public void actionPerformed(ActionEvent event)
          {if(event.getSource()==changeMaze)
          MazePanel.changeMa();
          repaint();   
          }
       }
    }窗口驱动类就加进了那个主面板...