2013-02-20 55 views
0

我有一個接口與2個JFormattedTextFields我需要的值(不只是顯示的文本)是相同的。理想情況下,它們都應該是可編輯的,其中一個被改變成另一個被鏡像。你可以鏈接兩個JFormattedTextFields的值嗎?

我開始時只是在兩者之間共享一個文檔,但很快就遇到了這樣的問題,即只鏈接顯示的文本,而不是底層的值。 (傻我!)
我還沒有嘗試爲「值」屬性添加互惠的PropertyChangeListeners,因爲我期望設置一個無限循環的修改。

我錯過了什麼嗎?有沒有辦法做到這一點?或者我堅持只允許用戶編輯兩個中的一個,並且只將值向一個方向傳播?

謝謝!

回答

2

我需要的值(不只是顯示的文本)是相同的。 理想情況下,它們應該都是可編輯的,其中一個是 鏡像在另一箇中。

enter image description here

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

我沒有想到DocumentListener會爲我工作,因爲我使用的是JFormattedTextField對象,而我想要複製的不僅僅是顯示的文本(我可以通過使用同一個文檔來完成),但是價值本身,一旦它被驗證。此外,我想我認爲調用setText()會觸發一個DocumentEvent,所以我不能在兩個方向上使用它。那是不正確的? – cmolodo 2013-02-20 13:55:31

+0

僅使用'setText()'而不是使用'Document'操作,'DocumentListene'r沒有被指定爲將事件觸發到'Document',然後必須使用'AbstractDocument'或'DocumentFilter' – mKorbel 2013-02-20 14:19:39

0

您可以使用一鍵收聽。您只需使用下面的代碼將密鑰偵聽器添加到這兩個字段。你需要其他事件的原因是它會拋出錯誤,除非你在代碼中包含它們。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class CreateGrid 
{  
    JFrame thisframe; 
    JFormattedTextField jFormattedTextField1, jFormattedTextField2; 

    public CreateGrid() 
    { 
     GridLayout thislayout = new GridLayout(0,2); 
     thisframe = new JFrame(); 
     thisframe.setLayout(thislayout); 

     jFormattedTextField1 = new JFormattedTextField(); 
     jFormattedTextField2 = new JFormattedTextField(); 
     jFormattedTextField1.addKeyListener(new KeyAdapter() 
     { 
      public void keyReleased(KeyEvent e) 
      {     
       JFormattedTextField textField = (JFormattedTextField) e.getSource(); 
       String text = textField.getText(); 
       jFormattedTextField2.setText(text); 
      } 
      public void keyTyped(KeyEvent e) 
      { 
      } 
      public void keyPressed(KeyEvent e) 
      { 
      }    
     }); 
     jFormattedTextField2.addKeyListener(new KeyAdapter() 
     { 
      public void keyReleased(KeyEvent e) 
      {     
       JFormattedTextField textField = (JFormattedTextField) e.getSource(); 
       String text = textField.getText(); 
       jFormattedTextField1.setText(text); 
      } 
      public void keyTyped(KeyEvent e) 
      { 
      } 
      public void keyPressed(KeyEvent e) 
      { 
      }    
     }); 
     thisframe.add(jFormattedTextField1); 
     thisframe.add(jFormattedTextField2); 
     thisframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     thisframe.setVisible(true); 
     thisframe.pack(); 
    } 

public static void main(String args[]) 
{ 
    new CreateGrid(); 
}  

} 我已經測試了這一點,它完美的作品,你鍵入一個場什麼都將顯示在其他您所輸入的。

相關問題