【问题标题】:Synchronize JTextFields Values by PropertyChangeListener通过 PropertyChangeListener 同步 JTextFields 值
【发布时间】:2011-06-27 12:10:59
【问题描述】:

当 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);
    }
}

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

【问题讨论】:

  • 它们可以共享相同的底层 Document 对象吗?然后将自动镜像更改。

标签: java swing


【解决方案1】:

例如,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();
            }
        });
    }
}

【讨论】:

  • 谢谢它的工作。我以前使用过 DocumentListener,但没有使用 invokeLater()。
【解决方案2】:
DocumentListener yourDocListener=...;
TXTFLD1.getDocument().addDocumentListener(yourDocListener);

【讨论】:

    【解决方案3】:

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

    在基于JTextComponent 组件,更改被广播 通过 DocumentEvent 从模型到 文档监听器。文档事件 给出变化的位置和 如果需要,更改的类型。这 代码片段可能看起来有些东西 喜欢:

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

    【讨论】:

      【解决方案4】:

      使用 ActionListener 或 DocumentListener 更改 PropertyChangeListener。

      【讨论】:

        【解决方案5】:

        那是因为没有人触发属性更改事件。阅读How to Write an Action Listener,尽管为了触发动作事件,您需要按下Enter。否则,您需要阅读How to Write a Document Listener

        【讨论】:

        • @TalhaAhmedKhan DocumentListener
        【解决方案6】:

        用这个方法代替。

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

        【讨论】:

        • 不适用于鼠标版本(复制和粘贴、拖放文本)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-10
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        • 2023-04-03
        • 2011-01-04
        相关资源
        最近更新 更多