Say,一个包含大量JCheckbox,JTextfields,JLists和其他JComponents的应用程序属性页面。 现在,我需要做的是跟踪用户所做的更改并保存它们。 实现这个的正确方法是什么?
答案 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 Patterns或Action Listener Tutorial
的第2章我希望这有点帮助,我现在不能掀起一个例子,但希望这会帮助你开始。
答案 3 :(得分:0)
Command类和可序列化的ArrayList或LinkedList of Commands。命令将在actionPerformed方法中生成。
答案 4 :(得分:-1)