通过PropertyChangeListener同步JTextFields值

我想在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); } } 

为什么属性更改侦听器不起作用。 这个问题的其他替代解决方案是什么?

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

 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(); } }); } } 
 DocumentListener yourDocListener=...; TXTFLD1.getDocument().addDocumentListener(yourDocListener); 

您应该向其文档注册文档侦听器 。 取自JTextField文档 :

在基于JTextComponent的组件中,通过DocumentEvent到DocumentListeners从模型广播更改。 如果需要,DocumentEvent提供更改的位置和更改的类型。 代码片段可能类似于:

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

使用ActionListener或DocumentListener更改PropertyChangeListener。

那是因为没有人解雇财产变更事件。 阅读如何编写动作侦听器 ,但为了触发动作事件,需要按Enter 。 否则,您需要阅读如何编写文档侦听器 。

写这个方法而不是。

用此方法替换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) {} });