跟踪swing GUI中的更改

时间:2009-05-17 19:44:31

标签: java swing

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您可以使用两种方法:

(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)的挑战就会出现。但这实际上取决于你在做什么。

答案 2 :(得分:1)

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

来自Google的

Java Example of Observer Pattern

如果您可以查看Head First Design PatternsAction Listener Tutorial

的第2章

我希望这有点帮助,我现在不能掀起一个例子,但希望这会帮助你开始。

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

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

当组件更改或通知特殊侦听器时,将通知单例管理器并可以处理此事件。

管理员可以记录进入的事件并保存EventObject,其中包含您要存储的所有内容。您可以使用xstream在磁盘上存储的EventObject列表。