使用监听器通过一次调用更新多个JTextField

时间:2017-06-01 18:27:12

标签: java listener deep-copy

使用JButtons,我可以创建一个AbstractAction并将其与许多JButtons相关联,这允许我使用1个命令启用/禁用许多按钮。

我希望具有相似的能力,但只需一次调用即可更新多个JTextField的值。不幸的是,我无法确定哪种类型的动作/听众或其他什么可以使用。

以下是创建2个JFrame的基本代码示例。一帧有一个JButton和一个JTextField。第二帧只有一个JTextField。

无论是单击按钮还是在JTextfield中命中Return,计数器都会递增并仅出现在frame1上的JTextField中。虽然在第2帧上点击JTextField进入,但该值仍然只在第1帧更新。

主要目标是通过doData()BUT更新两个帧上的JTextField,以通过一些Action或Listener或其他方式来直接引用JTextField本身。

    import java.awt.event.*;
    import java.awt.*;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;

    import javax.swing.*;

    public class DetachedUpdate 
    {
      JTextField field1 = new JTextField();
      int x = 1;
      public static void main(final String args[]) 
      {
          DetachedUpdate myApp = new DetachedUpdate();
          myApp.field1.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("actionPerformed()");
                    myApp.doData();
                }
            });
          buildFrame1(myApp.field1, myApp);
          buildFrame2(myApp.field1, myApp);
      }

      public void doData()
      {
          System.out.println("doData()");
          field1.setText(new Integer(x++).toString());
      }

      public static void buildFrame1(JTextField txtField, DetachedUpdate x)
      {

            JFrame frame = new JFrame("JToolBar Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JToolBar toolbar = new JToolBar();
            toolbar.setRollover(true);

            JButton button1 = new JButton("Button 1");

            button1.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("actionPerformed()");
                    x.doData();
                }
            });

            toolbar.add(button1);
            toolbar.add(txtField);
            Container contentPane = frame.getContentPane();
            contentPane.add(toolbar, BorderLayout.NORTH);
            contentPane.setPreferredSize(new Dimension(10,10));
            frame.setSize(500, 500);
            frame.setVisible(true);
      }

      public static void buildFrame2(JTextField txtField, DetachedUpdate x)
      {
          JTextField newField = new JTextField();

            ActionListener[] listeners = txtField.getActionListeners();  
            for (int i = 0; i < listeners.length; i++)
            {
                newField.addActionListener(listeners[i]);
            }

            JFrame frame = new JFrame("JToolBar Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JToolBar toolbar = new JToolBar();
            toolbar.setRollover(true);

            JButton button1 = new JButton("Button 1");

            toolbar.add(newField);
            Container contentPane = frame.getContentPane();
            contentPane.add(toolbar, BorderLayout.NORTH);
            contentPane.setPreferredSize(new Dimension(10,10));
            frame.setSize(500, 500);
            frame.setVisible(true);
      }
    }

1 个答案:

答案 0 :(得分:0)

actionPerformed本身用于两个字段,但这不会自动同步字段内容。查看DocumentListener并尝试对两者使用相同的DocumentListener。