Синхронизировать значения JTextFields с помощью PropertyChangeListener - PullRequest
3 голосов
/ 27 июня 2011

Я хочу скопировать значение jTextField - TXTFLD1 в другое jTextField -TXTFLD2 при изменении значения в TXTFLD1.
Я выбираю 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 ]

11 голосов
/ 27 июня 2011

Например, как предложил Станислав +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();
            }
        });
    }
}
5 голосов
/ 27 июня 2011
DocumentListener yourDocListener=...;
TXTFLD1.getDocument().addDocumentListener(yourDocListener);
3 голосов
/ 27 июня 2011

Вы должны зарегистрировать прослушиватель документов для этого документа. Взято из документации JTextField :

На основе JTextComponent компоненты, изменения транслируются от модели через DocumentEvent к DocumentListeners. DocumentEvent дает место изменения и вид изменений при желании. фрагмент кода может выглядеть что-то как:

 DocumentListener myListener = ??;
 JTextField myArea = ??;
 myArea.getDocument().addDocumentListener(myListener);
2 голосов
/ 27 июня 2011

Измените PropertyChangeListener с помощью ActionListener или DocumentListener.

1 голос
/ 27 июня 2011

Это потому, что нет ни одного события изменения свойства запуска.Прочтите Как написать прослушиватель действий , хотя для того, чтобы вызвать событие действия, необходимо нажать Enter.В противном случае вам нужно будет прочитать Как написать прослушиватель документов .

0 голосов
/ 27 июня 2011

Напишите этот метод вместо.

Замените 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) {}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...