//①请问如何用键盘事件控制开始画图,如何实现??
//②paint(),repaint()无法放到另外一个方法中吗?(我测试时报错)import java.awt.*;
import java.awt.event.*;class TestFrame extends Frame 
{   
  int i=0; 
  public void paint(Graphics g) 

 i=i+40;
 Color c=g.getColor();
 g.setColor(Color.green);
 g.fillRect(i,i,40,40);
 g.setColor(c);
 
 try
{
  Thread.sleep(600);
}
 catch(Exception e)

  e.printStackTrace();
}
 //update(g);
 repaint(); 
}

public void update(Graphics g)  //重写update()方法,只清除原来正方形的1/2。
{  
g.clearRect(i,i,20,20); 
paint(g);

}class Test
{
public static void main(String[] args)
{
TestFrame tf=new TestFrame();
Toolkit tool=tf.getToolkit();
Dimension dim=tool.getScreenSize();
  tf.setBounds(0,0,(int)((dim.width)/1.8),dim.height);
  tf.setVisible(true);
  tf.addWindowListener(new WindowAdapter()
                  { public void windowClosing(WindowEvent e)
                   {
                   //tf.setVisible(false);
                   System.exit(0);
                   }
                  });
tf.addKeyListener(new Monitor());
}
}class Monitor extends KeyAdapter              //当按下Enter键时在后台命令提示符打印"Enter",
{                                             //但我本意是要按下Enter时才开始在窗口画图,请求指教,谢谢!!
public void keyPressed(KeyEvent e)

if(e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("Enter");
}  
}

解决方案 »

  1.   


    import java.awt.*;
    import java.awt.event.*;class TestFrame extends Frame implements KeyListener
    {
        /**
         * 〈一句话功能简述〉
         */
        private static final long serialVersionUID = 1L;
        
        int i = 0;
        
        private boolean start = false;
        
        public void paint(Graphics g)
        {
            i = i + 40;
            Color c = g.getColor();
            g.setColor(Color.green);
            g.fillRect(i, i, 40, 40);
            g.setColor(c);
            
            try
            {
                Thread.sleep(600);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            
            repaint();
        }
        
        public void update(Graphics g) //重写update()方法,只清除原来正方形的1/2。
        {
            if (start)
            {
                g.clearRect(i, i, 20, 20);
                paint(g);
            }
            
        }
        
        @Override
        public void keyTyped(KeyEvent e)
        {
        }
        
        @Override
        public void keyReleased(KeyEvent e)
        {
        }
        
        @Override
        public void keyPressed(KeyEvent e)
        {
            if (e.getKeyCode() == KeyEvent.VK_ENTER)
            {
                start = true;
                System.out.println("Enter");
            }
            
        }
        
    }public class Test
    {
        public static void main(String[] args)
        {
            TestFrame tf = new TestFrame();
            Toolkit tool = tf.getToolkit();
            Dimension dim = tool.getScreenSize();
            tf.setBounds(0, 0, (int)((dim.width) / 1.8), dim.height);
            tf.setVisible(true);
            tf.addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent e)
                {
                    //tf.setVisible(false);
                    System.exit(0);
                }
            });
            
            tf.addKeyListener(tf);
        }
    }
      

  2.   

    你的代码太乱了,
    你可以这样,按键的时候,调用repaint()方法
      

  3.   

    一楼可以写个内部类来继承KeyAdapter, 就不用去实现KeyListener里所有的方法了
      

  4.   

    用一个start标志就解决了问题,非常感谢一楼指点!!不过还有一些小问题:
    ①应该在paint()方法中也加一个if(start)语句;
    ②在update()方法中还应该调用repaint()方法。注:这是一个很简单的小程序,希望可以帮助大家理解paint(),repaint()和update()之间的关系;
           整理后的代码如下,可运行。希望大家多多指点,谢谢!
    import java.awt.*;
    import java.awt.event.*;class TestFrame extends Frame implements KeyListener
    {
      int i = 0;
      private boolean start = false;
      
      public void paint(Graphics g)
      {
        if(start)
        {
       i = i + 40;
       Color c = g.getColor();
       g.setColor(Color.green);
       g.fillRect(i, i, 40, 40);
       g.setColor(c);
         
      try
       {
        Thread.sleep(600);
       }
       catch (Exception e)
       {
        e.printStackTrace();
       }
         
      repaint();
                 }
    }
         
      public void update(Graphics g) //重写update()方法,只清除原来正方形的1/4。
      {
       if (start)
       {
       g.clearRect(i, i, 20, 20);
       paint(g);
       }
      }
       
       public void keyPressed(KeyEvent e)
       {
       if (e.getKeyCode() == KeyEvent.VK_ENTER)
       {
       start = true;
       repaint();
       }
       } 
      
       public void keyTyped(KeyEvent e){}
       
       public void keyReleased(KeyEvent e){}
       
         
      
         
    }public class Test
    {
       public static void main(String[] args)
       {
       TestFrame tf = new TestFrame();
       Label label=new Label("按Enter键开始自动画图!"); 
       label.setBackground(Color.red);
               tf.add(label,"North");
       Toolkit tool = tf.getToolkit();
       Dimension dim = tool.getScreenSize();
       tf.setBounds(0, 0, (int)((dim.width) / 1.8), dim.height);
       tf.setVisible(true);
       
       tf.addWindowListener(new WindowAdapter()
       {
       public void windowClosing(WindowEvent e)
       {
         System.exit(0);
       }
       });
         
       tf.addKeyListener(tf);
       }
    }