Java 可以链接两个JFormattedTextFields的值吗?

Java 可以链接两个JFormattedTextFields的值吗?,java,swing,jformattedtextfield,documentlistener,Java,Swing,Jformattedtextfield,Documentlistener,我有一个带有2个JFormattedTextFields的接口,我需要它们的值(不仅仅是显示的文本)相同。理想情况下,它们都应该是可编辑的,其中一个的更改反映在另一个中 我一开始只是在两个文档之间共享一个文档,但很快就遇到了一个问题,即这只是链接显示的文本,而不是底层值。(我真傻!) 我还没有尝试为“value”属性添加互惠属性changelisters,因为我希望这会建立一个无限的修改循环 我错过什么了吗?有没有办法做到这一点?或者我只允许用户编辑其中一个,并且只允许值向一个方向传播 谢谢大家

我有一个带有2个JFormattedTextFields的接口,我需要它们的值(不仅仅是显示的文本)相同。理想情况下,它们都应该是可编辑的,其中一个的更改反映在另一个中

我一开始只是在两个文档之间共享一个文档,但很快就遇到了一个问题,即这只是链接显示的文本,而不是底层值。(我真傻!)
我还没有尝试为“value”属性添加互惠属性changelisters,因为我希望这会建立一个无限的修改循环

我错过什么了吗?有没有办法做到这一点?或者我只允许用户编辑其中一个,并且只允许值向一个方向传播

谢谢大家!

我需要值(不仅仅是显示的文本)相同。 理想情况下,它们都应该是可编辑的,其中一个可以修改 另一方面也反映了这一点

  • 使用

  • 例如(仅一个方向)


您可以使用密钥侦听器。您只需使用下面的代码向这两个字段添加一个键侦听器。您需要其他事件的原因是,除非代码中有错误,否则它将抛出错误

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();
}    
}
我已经对此进行了测试,它工作得非常好,无论您在一个字段中键入什么,当您键入它时,它都会在另一个字段中显示。

我认为DocumentListener对我不起作用,因为我使用的是JFormattedTextField对象,我想要复制的不仅仅是显示的文本(我可以通过让两者都使用同一个文档来实现这一点)但价值本身,一旦被验证。另外,我想我假设调用setText()会触发DocumentEvent,所以我不能在两个方向上都使用它。这不正确吗?请仅使用
setText()
而不是使用
Document
进行操作,
DocumentListene
r未指定向
Document
触发事件,然后必须改为使用
AbstractDocument
DocumentFilter
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();
}