通过PropertyChangeListener同步JTextFields值 [英] Synchronize JTextFields Values by PropertyChangeListener

查看:99
本文介绍了通过PropertyChangeListener同步JTextFields值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在TXTFLD1的值复制 jTextField - TXTFLD1 的值到另一个 jTextField -TXTFLD2 变化。

我选择 propertychangelistener ,因为我无法检测到TXTFLD1的值何时发生变化,因为它被一些我现在无法修改的外部代码所改变。 / p>

测试代码如下:

  
public class TxtFldSync扩展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 =新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));

//监听器
TXTFLD1.addPropertyChangeListener(value,new PropertyChangeListener(){
@Override
public void propertyChange(PropertyChangeEvent arg0){
TXTFLD2.setText(TXTFLD1.getText()+由更改侦听器设置);
//这不起作用的原因是什么?
}
});
BTN1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0){
TXTFLD1.setText(Action Performed);
/ / i使用属性更改侦听器为TXTFLD2设置相同的值
}
});

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

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

解决方案

例如,正如StanislavL +1所建议的那样使用 DocumentListener

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

公共类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(){

@覆盖
public void run(){
createAndShowUI();
}
});
}
}


I want to copy the value of a jTextField - TXTFLD1 to another jTextField -TXTFLD2 when the value at TXTFLD1 changes.
I choose propertychangelistener because i cannot detect when the value at TXTFLD1 is changed, Because it is changed by some external code which i cannot modify now.

The test code is as follows :


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

Why the property change listener is not working. What are the other alternatives solution for this problem?

解决方案

For example, as StanislavL +1 suggested by using 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();
            }
        });
    }
}

这篇关于通过PropertyChangeListener同步JTextFields值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆