【问题标题】:Tracking changes in a swing GUI在 swing GUI 中跟踪更改
【发布时间】:2009-05-17 19:44:31
【问题描述】:

比如说,一个包含许多 JCheckboxes、JTextfields、JLists 和其他 JComponents 的应用程序属性页面。 现在,我需要做的是跟踪用户所做的更改并保存它们。 实现这一点的正确方法是什么?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    您不需要实时跟踪更改(除非有特殊需要)。

    您可以对“确定”按钮做出反应,对组件进行迭代,获取它们的值,或许可以与旧的进行比较,或者只是盲目地保存所有值。
    如果用户取消,当然放弃一切。

    【讨论】:

      【解决方案2】:

      您可以使用两种方法:

      (1) 当用户在您的属性页面上单击“确定”时,从您的 JComponents 中提取当前值并更新您的设置或诸如此类的东西。这是最简单的方法,因为您不需要 ActionListeners,并且如果用户退出,您不必回滚更改(但从您的问题来看,此对话框/页面的作用并不完全清楚)。

      (2) 对于实现ActionListener 的swing 对象,监听ActionEvent 并相应地处理变化。对于 JTextFields,使用 DocumentListener,如下面的示例代码所示:

      import java.awt.BorderLayout;
      
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.JTextField;
      import javax.swing.event.DocumentEvent;
      import javax.swing.event.DocumentListener;
      
      public class Test implements DocumentListener
      {
        private JTextField jtf;
      
        public static void main(String[] args)
        { 
          javax.swing.SwingUtilities.invokeLater(new Runnable()
              {
                public void run()
                {
                  Test test = new Test();
                }
              });
        }
        public Test()
        {
          JFrame jf = new JFrame();
          JPanel jp = new JPanel();
          jtf = new JTextField();
          jtf.getDocument().addDocumentListener(this);
          jp.setLayout(new BorderLayout());
          jp.add(jtf, BorderLayout.CENTER);
          jf.add(jp);
          jf.setSize(200, 100);
          jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          jf.setVisible(true);
        }
      
        public void changedUpdate(DocumentEvent e) 
        {
         // Do stuff here
        }
        public void insertUpdate(DocumentEvent e) 
        {
          // Do stuff here
        }
        public void removeUpdate(DocumentEvent e) 
        {
          // Do stuff here
        }
      }
      

      正如您可能从 (1) 中猜到的,如果用户退出并且您必须考虑如何回滚任何更改,那么 (2) 中的挑战就会出现。不过,这真的取决于你在做什么。

      【讨论】:

        【解决方案3】:

        Observer Pattern 应该对此有所帮助。基本上它允许一个组件(发布者)通知其他组件(订阅者)事情,基本上它是一个 ActionListener(如Catchwa's Answer)。

        Java Example of Observer Pattern 来自 Google

        如果您可以查看Head First Design Patterns 或Action Listener Tutorial 的第 2 章

        希望对您有所帮助,目前我无法举出一个例子,但希望这能帮助您入门。

        【讨论】:

          【解决方案4】:

          Command 类和可序列化的 ArrayList 或 LinkedList 的命令。命令将在 actionPerformed 方法中生成。

          【讨论】:

          • 是的,但只是输入 JTextfield 不会生成 ActionEvents。
          • 难道没有用于输入文本字段的事件处理程序吗?你所需要的只是一个抽象的命令类和子类,如 TypingCommand、CheckboxCommand 等。至少我会这样做
          【解决方案5】:

          我的主要问题是,您要记录哪些更改/事件。 点击、文本更改、按钮状态、....

          对于每个事件,您都可以将侦听器添加到 swing 组件。一个singleton 类可能是您要添加到不同组件的侦听器的实现者。您可以将这些单例类添加到不同的组件中。

          当组件发生变化或通知特殊监听器时,通知单例管理器并可以处理此事件。

          管理器可以记录即将到来的事件,还可以保存一个 EventObject,其中包含您要存储的所有内容。可以使用xstream 存储在磁盘上的 EventObject 列表。

          【讨论】:

          • 在这种情况下我不会使用单例...这没有必要并且会限制您的灵活性。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多