【问题标题】:Can you link values for two JFormattedTextFields?您可以链接两个 JFormattedTextField 的值吗?
【发布时间】:2013-02-05 11:14:27
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: java swing jformattedtextfield documentlistener


    【解决方案1】:

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

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

    【讨论】:

    • 我认为 DocumentListener 不适合我,因为我使用的是 JFormattedTextField 对象,而我想要复制的不仅仅是显示的文本(我可以通过同时使用相同的文档)但值本身,一旦它被验证。另外,我想我假设调用 setText() 会触发 DocumentEvent,所以我不能在两个方向上都使用它。这不正确吗?
    • 仅使用setText() 而不是使用Document 进行操作,DocumentListener 未指定将事件触发到Document,然后必须使用AbstractDocumentDocumentFilter 代替
    【解决方案2】:

    您可以使用键侦听器。您只需使用以下代码向两个字段添加一个键侦听器。您需要其他事件的原因是它会抛出错误,除非您在代码中包含它们。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2015-10-26
      相关资源
      最近更新 更多