【发布时间】:2009-05-17 19:44:31
【问题描述】:
比如说,一个包含许多 JCheckboxes、JTextfields、JLists 和其他 JComponents 的应用程序属性页面。 现在,我需要做的是跟踪用户所做的更改并保存它们。 实现这一点的正确方法是什么?
【问题讨论】:
比如说,一个包含许多 JCheckboxes、JTextfields、JLists 和其他 JComponents 的应用程序属性页面。 现在,我需要做的是跟踪用户所做的更改并保存它们。 实现这一点的正确方法是什么?
【问题讨论】:
您不需要实时跟踪更改(除非有特殊需要)。
您可以对“确定”按钮做出反应,对组件进行迭代,获取它们的值,或许可以与旧的进行比较,或者只是盲目地保存所有值。
如果用户取消,当然放弃一切。
【讨论】:
您可以使用两种方法:
(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) 中的挑战就会出现。不过,这真的取决于你在做什么。
【讨论】:
Observer Pattern 应该对此有所帮助。基本上它允许一个组件(发布者)通知其他组件(订阅者)事情,基本上它是一个 ActionListener(如Catchwa's Answer)。
Java Example of Observer Pattern 来自 Google
如果您可以查看Head First Design Patterns 或Action Listener Tutorial 的第 2 章
希望对您有所帮助,目前我无法举出一个例子,但希望这能帮助您入门。
【讨论】:
Command 类和可序列化的 ArrayList 或 LinkedList 的命令。命令将在 actionPerformed 方法中生成。
【讨论】: