通过PropertyChangeListener同步JTextFields值

时间:2011-06-27 12:10:59

标签: java swing

当TXTFLD1的值发生变化时,我想将jTextField - TXTFLD1的值复制到另一个jTextField -TXTFLD2
我选择propertychangelistener因为我无法检测到TXTFLD1的值何时发生变化,因为它被一些我现在无法修改的外部代码所改变。

测试代码如下:


public class TxtFldSync extends JFrame {
    private JButton BTN1 = null;
    private JTextField TXTFLD1 = null;
    private JTextField TXTFLD2 = null;

    public static void main(String[] args) {
            TxtFldSync thisClass = new TxtFldSync();
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            thisClass.setVisible(true);
    }
    public TxtFldSync() {
        super();
        this.setSize(300, 200);
        BTN1 = new JButton();
        BTN1.setBounds(new Rectangle(178, 38, 67, 17));
        TXTFLD1 = new JTextField();
        TXTFLD1.setBounds(new Rectangle(32, 42, 83, 20));

        TXTFLD2 = new JTextField();
        TXTFLD2.setBounds(new Rectangle(30, 78, 83, 20));

        //listeners
        TXTFLD1.addPropertyChangeListener("value", new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent arg0) {
                TXTFLD2.setText(TXTFLD1.getText()+"set by change listener");
                //this doesnot work why ?
            }
        });
        BTN1.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                TXTFLD1.setText("Action Performed");
                //i what to set same value to TXTFLD2 using property change listener
            }
        });

        this.setContentPane(new Container());
        this.getContentPane().add(BTN1);
        this.getContentPane().add(TXTFLD1);
        this.getContentPane().add(TXTFLD2);
    }
}

为什么属性更改侦听器无法正常工作。 这个问题的其他替代解决方案是什么?

6 个答案:

答案 0 :(得分:11)

例如,正如StanislavL +1建议使用DocumentListener

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TextLabelMirror {

    private JPanel mainPanel = new JPanel();
    private JTextField field = new JTextField(20);
    private JTextField field1 = new JTextField(20);

    public TextLabelMirror() {
        field.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void changedUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            private void updateLabel(DocumentEvent e) {
                java.awt.EventQueue.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        field1.setText(field.getText());
                    }
                });
            }
        });

        mainPanel.setLayout(new GridLayout(1, 0, 10, 0));
        mainPanel.add(field);
        mainPanel.add(field1);
    }

    public JComponent getComponent() {
        return mainPanel;
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("TextLabelMirror");
        frame.getContentPane().add(new TextLabelMirror().getComponent());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}

答案 1 :(得分:5)

DocumentListener yourDocListener=...;
TXTFLD1.getDocument().addDocumentListener(yourDocListener);

答案 2 :(得分:3)

您应该在其文档中注册document listener。取自JTextField documentation

  

在基于JTextComponent   组件,广播变化   从模型通过DocumentEvent到   DocumentListeners。 DocumentEvent   给出了变化的位置和   如果需要,那种变化。该   代码片段可能看起来像什么   像:

 DocumentListener myListener = ??;
 JTextField myArea = ??;
 myArea.getDocument().addDocumentListener(myListener);

答案 3 :(得分:2)

使用ActionListener或DocumentListener更改PropertyChangeListener。

答案 4 :(得分:1)

那是因为没有人解雇财产变更事件。阅读How to Write an Action Listener,但为了触发操作事件,您需要按Enter。否则,您需要阅读How to Write a Document Listener

答案 5 :(得分:0)

编写此方法而不是。

使用此方法替换TXTFLD1.addPropertyChangeListener:

TXTFLD1.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent arg0) {}
    @Override
    public void keyReleased(KeyEvent arg0) {
        TXTFLD2.setText(TXTFLD1.getText());
    }
    @Override
    public void keyPressed(KeyEvent arg0) {}
});