题目:编写程序:自定义一个类,继承Frame,创建该类对象,并在其上添加1个标签,标签上初始文字为“A”,当按下键盘的向右方向键时,其文字变为“B”,以此类推,当按下左方向键时,则分别变为当前字母的前一字母。
代码:
import java.awt.*;
import java.awt.event.*;
public class Java extends Frame implements KeyListener{
static Label l= new Label("A");

public static void main(String args[]) {
Java j = new Java();
l.addKeyListener(j);
j.setSize(200,200);
j.add(l);
j.setVisible(true);
}

public void keyPressed(KeyEvent e) 
{
if (e.getKeyCode()==e.VK_LEFT) {
l.setText("B");
}
if(e.getKeyCode()==e.VK_RIGHT) {
l.setText("A");
}
 
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
}
哪里出错了?

解决方案 »

  1.   

    static Label l= new Label("A");
    改为
    static JTextField l= new JTextField("A");Label 不能获取焦点,没有key事件
      

  2.   

    你添加的侦听有问题,对一个可以接受输入的组件添加侦听,下面已经实现了左右键控制标签显示A B,剩下业务逻辑你自己实现吧import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    public class Java extends JFrame implements KeyListener{
        static JLabel l= new JLabel("A");
        static JTextField tf=new JTextField(15);    public static void main(String args[]) {
            Java j = new Java();        j.setSize(200,200);
            j.getContentPane().setLayout(new FlowLayout());
            j.getContentPane().add(l);
            j.getContentPane().add(tf);
            tf.addKeyListener(j);
            j.setVisible(true);
            j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }        public void keyPressed(KeyEvent e){
                if (e.getKeyCode()==KeyEvent.VK_LEFT) {
                    System.out.println("-------");
                    l.setText("B");
                    
                }
                if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
                    l.setText("A");
                }        }
        public void keyTyped(KeyEvent e) {
    //        System.out.println("-------");
        }
        public void keyReleased(KeyEvent e) {
    //        System.out.println("-------");
        }
    }
      

  3.   

    改成
            j.addKeyListener(j);道理是1楼说的。
      

  4.   

    把label放到JPanel里,给JPanel添加事件
      

  5.   

    添加一个键盘监听事件,由键盘触发时,,,,,对Label做响应.设置植!!!
      

  6.   

    大牛们,你们把需求理解错误了。楼主应该是想要按右键,当前字符+1,比如A变成B,B变成C。按左键则少1。public void keyPressed(KeyEvent e){
                if (e.getKeyCode()==KeyEvent.VK_LEFT) {
                    System.out.println("-------");
                    String txt = l.getText();
                    char c = txt.charAt(0);
                    if(!txt.equals("A"))
                     l.setText(String.valueOf((char)(c-1)));
                    
                }
                if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
                 String txt = l.getText();
                    char c = txt.charAt(0);
                    if(!txt.equals("Z"))
                     l.setText(String.valueOf((char)(c+1)));
                }        }
      

  7.   

    正解。老师后来又跑来跟我说,应该在窗口上添加监听器,我只想说。我大学的这个JAVA老师真不行。。这问题都要折腾很久
      

  8.   


    import java.awt.Frame;
    import java.awt.Label;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;public class TT extends Frame{ static Label l = new Label("A");
    int n = 65;
    public TT() {
    this.add(l);
    this.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) {
    switch(e.getKeyCode()) {
    case(KeyEvent.VK_RIGHT):
    n++;
    if(n>90) {
    n = 90;
    }
    String s = String.valueOf((char)n);
    TT.this.l.setText(s);
    break;
    case(KeyEvent.VK_LEFT):
    n--;
    if(n<65) {
    n = 65;
    }
    String ss = String.valueOf((char)n);
    TT.this.l.setText(ss);
    break;
    }
    }

    });
    this.setBounds(40, 50, 200, 200);
    this.setVisible(true);
    }

    public static void main(String[] args) {
    new TT();
    }
    }
      

  9.   

    LZ怎么又是你呢?
    package com.meteor.basic;import java.awt.Frame;
    import java.awt.Label;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;public class LabelEventMoniter extends Frame{ private static final long serialVersionUID = 1L;
    private Label label; public void LunchFram() {
    this.setTitle("标签事件监听测试");
    this.setLocationRelativeTo(null);
    this.setAlwaysOnTop(true);
    this.setResizable(false);

    label = new Label("A");
    this.addKeyListener(this.new Mointer());

    this.add(label);
    this.pack();
    this.setVisible(true);

    this.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e){
    setVisible(false);
    System.exit(-1);
    }
    });

    }

    private class Mointer extends KeyAdapter {
    public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    switch(keyCode) {
    case KeyEvent.VK_RIGHT :
    label.setText("B");
    break;
    case KeyEvent.VK_LEFT :
    label.setText("A");
    break;
    }
    }
    }

    public static void main(String [] args) {
    new LabelEventMoniter().LunchFram();
    }
    }
      

  10.   

    刚没有看见LZ的要求,把前面SWITCH替换成现在的就可以了。
    switch(keyCode) {
    case KeyEvent.VK_RIGHT :
    str = label.getText();
     a = str.charAt(0);
    if(a <65 || a > 89) {
    label.setText("A");
    }else{
    label.setText(String.valueOf(((char)(a+1))));
    }
    System.out.println(a);
    break;
    case KeyEvent.VK_LEFT :
     str = label.getText();
     a = str.charAt(0);
     if(a < 66) {
     label.setText("A");
     }else {
     label.setText(String.valueOf((char)(a-1)));
     }
    break;
    }