2013-02-20 2 views
0

두 개의 JFormattedTextFields가있는 인터페이스가 있는데, 그 중 하나는 표시되는 텍스트가 아니라 동일한 값을 필요로합니다. 이상적으로는 둘 모두를 편집 가능해야하며 하나의 변경이 다른 쪽에서 반영되어야합니다.두 개의 JFormattedTextField에 대한 값을 연결할 수 있습니까?

두 문서간에 하나의 문서를 공유하기 시작했지만이 문제는 신속하게 문제를 일으키지 만 표시된 값은 기본 값이 아니라 단지 링크 된 것입니다. (Silly me!)
"value"속성에 대한 상호 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 객체를 사용하고 있기 때문에 DocumentListener가 작동하지 않을 것이라고 생각했는데 복사 한 내용이 표시되는 텍스트가 아닙니다 (동일한 문서를 사용하는 것만으로도 가능합니다). 그러나 값 자체는 일단 유효성이 검증되면 또한 setText()를 호출하면 DocumentEvent가 트리거된다고 가정하므로이 방법을 양방향으로 사용할 수 없습니다. 그게 잘못된거야? – cmolodo

+0

'Document'로 조작하는 대신'setText()'만 사용하고,'DocumentListene'r은 이벤트를'Document'로 시작하도록 지정되어 있지 않습니다. 대신'AbstractDocument' 또는'DocumentFilter'를 사용해야합니다. – mKorbel

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

} 나는 이것을 테스트하고 그것은 당신이 당신이 그것을 입력 할 때 다른에 표시됩니다 하나 개의 필드에 입력 무엇도 완벽하게 작동합니다.

관련 문제