0

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

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

我错过了什么吗?有没有办法做到这一点?还是我坚持只允许用户编辑两者之一并且只让值在一个方向传播?

谢谢!

4

2 回答 2

2

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

在此处输入图像描述

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();
            }
        });
    }
}
于 2013-02-20T12:43:39.193 回答
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();
}    

我已经对此进行了测试,它可以完美地工作,无论您在一个字段中输入什么,都会在您输入时显示在另一个字段中。

于 2014-12-05T17:10:08.027 回答