现在有3个JTextField:tf1,tf2,tf3。想实现如下功能:当改变其中一个组件的内容时,其他2个组件的内容也跟着变化,显示相同的内容,如何实现?我尝试过用:Document类和DocumentListener接口,但好像陷入了死循环。部分代码如下:
=====================代码(1)=============================== 
        DL dl = new DL();
        //把tf1,tf2,tf3的Document实现同一个DocumentListener接口
        dl.addMember(tf1);       
        dl.addMember(tf2);
        dl.addMember(tf3);
=======================代码(2)=================================
class DL implements DocumentListener {    ArrayList<JTextField> members = new ArrayList<JTextField>();    public void addMember(JTextField tf) {
        tf.getDocument().addDocumentListener(this);
        members.add(tf);
    }    @Override
    public void insertUpdate(DocumentEvent e) {
        setMemberText(e);
    }    @Override
    public void removeUpdate(DocumentEvent e) {
        setMemberText(e);
    }    @Override
    public void changedUpdate(DocumentEvent e) {    }    private void setMemberText(DocumentEvent e) {        
        for (JTextField d : members) {            
            if (d.getDocument() == e.getDocument()) { //如果是组件本身引起的变化,无需改变该组件的内容。
                continue;
            }            
            try {
                String str=e.getDocument().getText(0, e.getDocument().getLength());
                d.setText(str);          //改变其他组件的内容
            } catch (Exception ex) {            
            }
        }
    }
}
========================================
这样做有个缺点:当某一个JTextField的内容发生变化时,其他2个也会受到影响,从而跟着改变内容。改变内容后,又影响原来的JTextField改变,如此循环~~~~~请问,这种方法能行得通吗?如果可以,应如何修改?

解决方案 »

  1.   

    最简单的方法是三个文本框使用同一个Documentimport java.awt.BorderLayout;import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.text.PlainDocument;public class T
    {
    public static void main(String[] args)
    {
    PlainDocument doc = new PlainDocument();
    JTextField tf1 = new JTextField(doc, null, 10);
    JTextField tf2 = new JTextField(doc, null, 10);
    JTextField tf3 = new JTextField(doc, null, 10);

    JFrame f = new JFrame();
    f.getContentPane().add(tf1, BorderLayout.NORTH);
    f.getContentPane().add(tf2, BorderLayout.CENTER);
    f.getContentPane().add(tf3, BorderLayout.SOUTH);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }
    }