通过PropertyChangeListener同步JTextFields值 [英] Synchronize JTextFields Values by PropertyChangeListener
问题描述
我想在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屋!