2013-02-20 54 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(); 
}  

} 我已经测试了这一点,它完美的作品,你键入一个场什么都将显示在其他您所输入的。

相关问题