0

値 (表示されるテキストだけでなく) が同一である必要がある 2 つの JFormattedTextFields とのインターフェイスがあります。理想的には、両方が編集可能で、一方の変更が他方に反映されるようにする必要があります。

2 つの間で 1 つの Document を共有することから始めましたが、すぐに問題が発生しました。これは、基になる値ではなく、表示されたテキストをリンクするだけです。(ばかばかしい!)
「値」プロパティに相互の PropertyChangeListeners を追加しようとはしていません。変更の無限ループが設定されると予想されるからです。

何か不足していますか?これを行う方法はありますか?それとも、ユーザーが 2 つのうちの 1 つだけを編集できるようにし、値が一方向にのみ伝搬されるようにすることに固執していますか?

ありがとうございました!

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

} 私はこれをテストしましたが、1 つのフィールドに入力すると、もう一方のフィールドに表示されるものは完全に機能します。

于 2014-12-05T17:10:08.027 に答える