学习KeyEvent的时候,想编写一个小程序用来接受输入的键,然后显示在panel上,但是编译运行该程序,却没有反应,不晓得错在哪里,希望高手能给出解答,十分感谢!
     代码:
        import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyEventTest
{
    public static void main(String[] args)
    {
       KeyEventFrame frame=new KeyEventFrame();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setVisible(true);
    }
}class KeyEventFrame extends JFrame
{
    public KeyEventFrame()
    {
       setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
       KeyEventPanel panel=new KeyEventPanel();
       add(panel);
    }
    public static final int DEFAULT_WIDTH=300;
    public static final int DEFAULT_HEIGHT=200;
}class KeyEventPanel extends JPanel
{
     String enter="";
    private int intX=0;
    private int intY=0;
    public KeyEventPanel()
    {
        addKeyListener(new KeyAdapter(){
            public void keyTyped(KeyEvent e)
            {
                enter=e.getKeyText(e.getKeyCode());
                repaint();
                if(intX<300)
                   intX+=15;
                else
                {
                   intY+=15;
                   intX=0;
                 }
            }
        });
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2=(Graphics2D)g;
        g2.drawString(enter,intX,intY);
    }
}

解决方案 »

  1.   

    我随便改了下,你看看,应该符合你的要求
    package com.qu.bean;
    import java.awt.*; 
    import java.awt.event.*; import javax.swing.*; 
    public class KeyEventTest 

        public static void main(String[] args) 
        { 
          KeyEventFrame frame=new KeyEventFrame(); 
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
          frame.setVisible(true); 
        } 
    } class KeyEventFrame extends JFrame 

        public KeyEventFrame() 
        { 
          setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT); 
          KeyEventPanel panel=new KeyEventPanel(); 
          add(panel); 
        } 
        public static final int DEFAULT_WIDTH=500; 
        public static final int DEFAULT_HEIGHT=500; 
    } class KeyEventPanel extends JPanel 

        String enter=""; 
        private int intX=0; 
        private int intY=0; 
        private JTextField txtA;
        private JTextField txtB;
        public KeyEventPanel() 
        { 
         this.setLayout(null);
         txtA = new JTextField(20);
         txtB = new JTextField(20);
         txtA.setBounds(120, 42, 150, 30);
         txtB.setBounds(120, 72, 150, 30);
         this.add(txtA);
         this.add(txtB);
        
         final StringBuffer str = new StringBuffer();
        
         txtA.addKeyListener(new KeyListener(){ 
            
                public void keyTyped(KeyEvent e) 
                { 
                    enter=e.getKeyText(e.getKeyCode()); 
                    System.out.println(enter);
                    str.append(""+ e.getKeyChar());
                    txtB.setText(str.toString());
                    
                    repaint(); 
                    if(intX <300) 
                      intX+=15; 
                    else 
                    { 
                      intY+=15; 
                      intX=0; 
                    } 
                } @Override
    public void keyPressed(KeyEvent e) {


    } @Override
    public void keyReleased(KeyEvent e) {



            }); 
        } 
        public void paintComponent(Graphics g) 
        { 
            super.paintComponent(g); 
            Graphics2D g2=(Graphics2D)g; 
            g2.drawString(enter,intX,intY); 
        } 
    }
      

  2.   

    我把你的代码改了改基本实现了你要的功能,只是没有对输入字符超过窗体宽度后进行换行处理package demo;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class KeyEventTest {
    KeyEventPanel panel = null; KeyEventFrame frame = null; public static void main(String[] args) {
    KeyEventTest mKeyEventTest = new KeyEventTest();
    mKeyEventTest.init();
    } public void init() {
    frame = new KeyEventFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame
    .setSize(KeyEventFrame.DEFAULT_WIDTH,
    KeyEventFrame.DEFAULT_HEIGHT);
    panel = new KeyEventPanel();
    frame.getContentPane().add(panel);
    frame.setVisible(true);
                    //这句一定要加,只有将焦点放入panel才可监听到键盘
    panel.requestFocusInWindow();
    } class KeyEventFrame extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L; public KeyEventFrame() { } public static final int DEFAULT_WIDTH = 300; public static final int DEFAULT_HEIGHT = 200;
    } class KeyEventPanel extends JPanel {
    /**
     * 
     */
    private static final long serialVersionUID = 1L; private int intX = 0; private int intY = 30; String enter = ""; public KeyEventPanel() {
    addKeyListener(new KeyAdapter() {
                                     //注意这里:
    // 对于按下键和释放键事件,getKeyCode 方法返回该事件的 keyCode。对于键入键事件,getKeyCode
    // 方法总是返回 VK_UNDEFINED。
    // 因此此处应用按下键和释放键函数处理
    public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) {
    char enterChar[] = { e.getKeyChar() };
    String tmp = new String(enterChar);
    enter = enter + tmp;
    repaint();
    } public void keyReleased(KeyEvent e) {
    } });
    } public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(Color.BLACK);
    g.drawString(enter, intX, intY);
    }
    }
    }
      

  3.   

    谢谢,再问一下private static final long serialVersionUID = 1L;  这个是干什么用的??
      

  4.   

    这个serialVersionUID是一个类的串行标识,作用是序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。