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