当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);
}
}
为什么属性更改侦听器无法正常工作。 这个问题的其他替代解决方案是什么?
答案 0 :(得分:11)
例如,正如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();
}
});
}
}
答案 1 :(得分:5)
DocumentListener yourDocListener=...;
TXTFLD1.getDocument().addDocumentListener(yourDocListener);
答案 2 :(得分:3)
您应该在其文档中注册document listener。取自JTextField documentation:
在基于JTextComponent 组件,广播变化 从模型通过DocumentEvent到 DocumentListeners。 DocumentEvent 给出了变化的位置和 如果需要,那种变化。该 代码片段可能看起来像什么 像:
DocumentListener myListener = ??;
JTextField myArea = ??;
myArea.getDocument().addDocumentListener(myListener);
答案 3 :(得分:2)
使用ActionListener或DocumentListener更改PropertyChangeListener。
答案 4 :(得分:1)
那是因为没有人解雇财产变更事件。阅读How to Write an Action Listener,但为了触发操作事件,您需要按Enter
。否则,您需要阅读How to Write a Document Listener。
答案 5 :(得分:0)
编写此方法而不是。
使用此方法替换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) {}
});