我的目的是一个面板中有一个 JTextField 一个JLabel,当在textfield中输入输入数据时,label中的文本从real-time update自动变为keytyped,听起来简单,是则没那么简单,问题我解决了,可错误发生的具体流程我没搞懂,和朋友没切磋一下,最好吧下面两个类粘贴到IDE中,倪们能解释这其中错误的原因吗?public class Apanel extends Panel{
private JTextField textField=null;
private JLabel label
public Apanel(){
}
initialize(){
this.setLayout(new FlowLayout());
this.add(getTextField());
this.add(getLabel());
}
public JTextField getTextField(){
if(textField == null ){
textField = new JTextField();
textField.addKeyListener(new Handler(this));
}
return textField;
}
public JLabel getLabel(){
label= new JLabel("real-time update");
return label;
}}
===============================================
public class Handler implements KeyListener{
private Apanel apanel;public Handler(Apanel apanel){
this.apanel=apanel;
}
public void keyTyped(final KeyEven e){
Thread t= new Thread(){
public void run(){
apanel.getLabel().setText("keytyped");
}
};
t.start();}
public void keyPressed(){}
public void keyReleased(){}
}

解决方案 »

  1.   

    label只是一个指向JLabel对象的引用,label = new JLabel("dsdsds")使label指向了一个新的对象,但添加到panel里的JLabel不会被改变
    public class Apanel extends Panel
    {
    private JTextField textField=null;
    private JLabel label = new JLabel("real-time update");////////////

    public Apanel()
    {
    }

    initialize()
    {
    this.setLayout(new FlowLayout());
    this.add(getTextField());
    this.add(getLabel());
    }

    public JTextField getTextField()
    {
    if(textField == null ){
    textField = new JTextField();
    textField.addKeyListener(new Handler(this));
    }
    return textField;
    } public JLabel getLabel(){
    /////////label= new JLabel("real-time update");
    return label;
    }
    }
      

  2.   

    事件响应那里没有必要用线程
    public class Handler implements KeyListener{
    private Apanel apanel;

    public Handler(Apanel apanel){
    this.apanel=apanel;
    }
    public void keyTyped(final KeyEven e){
    /* Thread t= new Thread(){
    public void run(){
    apanel.getLabel().setText("keytyped");
    }
    };
    t.start();
    */
    apanel.getLabel().setText("keytyped");
    }

    public void keyPressed(){}
    public void keyReleased(){}
    }
      

  3.   

    应该使用
    jTextField.getDocument().addDocumentListener(new DocumentListener(){
        public void changedUpdate(DocumentEvent e) {
            label.setText(...);
        }
        
        public void insertUpdate(DocumentEvent e) {
            label.setText(...);
        }    public void removeUpdate(DocumentEvent e) {
            label.setText(...);
        }
     });