2011-06-27 61 views
3

當TXTFLD1的值更改時,我想將jTextField - TXTFLD1的值複製到另一個jTextField -TXTFLD2
我選擇propertychangelistener,因爲我無法檢測TXTFLD1的值何時發生更改,因爲它由一些我現在無法修改的外部代碼更改。通過PropertyChangeListener同步JTextFields值

測試代碼如下:


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

它們可以共享相同的底層Document對象?然後更改將自動鏡像。 –

回答

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(); 
      } 
     }); 
    } 
} 
+0

+1:永遠完整的例子:) – Heisenbug

+0

感謝它的工作。我以前使用過DocumentListener但沒有invokeLater()。 – gtiwari333

+0

+1我太懶惰了。 – StanislavL

5
DocumentListener yourDocListener=...; 
TXTFLD1.getDocument().addDocumentListener(yourDocListener); 
2

使用ActionListener或DocumentListener更改PropertyChangeListener。

3

您應該註冊一個document listener它的文件。從JTextField documentation摘自:

在基於JTextComponent的 部件,變化經由的DocumentEvent從模型廣播 到 DocumentListeners。如果需要,DocumentEvent 給出了更改的位置和 的更改類型。該 代碼片段可能看起來像 :

DocumentListener myListener = ??; 
JTextField myArea = ??; 
myArea.getDocument().addDocumentListener(myListener); 
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) {} 
}); 
+0

不適用於鼠標版本(複製並粘貼,拖放文本)。 – barwnikk