Допустим, у вас есть класс модель для представления состояния графического интерфейса:
public class Model
{
private String name = "";
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
Вы можете отобразить это в графическом интерфейсе с помощью JPanel, например:
public class GuiPanel extends JPanel
{
private final Model model;
private final JTextField nameField;
public GuiPanel(Model model)
{
this.model = model;
JLabel nameLabel = new JLabel("Name");
nameField = new JTextField(50);
nameField.setText(model.getName());
add(nameLabel);
add(nameField);
}
public void init()
{
nameField.addKeyListener(new KeyListener()
{
public void keyTyped(KeyEvent e)
{
updateModel();
}
public void keyPressed(KeyEvent e)
{
updateModel();
}
public void keyReleased(KeyEvent e)
{
updateModel();
}
});
}
public void updateModel()
{
model.setName(nameField.getText());
}
}
Обратите внимание, что при изменении графического интерфейса изменения распространяются на объект модели.Состояние модели можно сериализовать, используя что-то вроде XStream:
public class Serializer
{
public String serialize(Model model)
{
XStream xstream = new XStream();
return xstream.toXML(model);
}
public Model deserialize(String xml)
{
XStream xstream = new XStream();
return (Model) xstream.fromXML(xml);
}
}
Теперь панель можно отобразить на JFrame, например:
public class Main
{
public static void main(String[] args) throws Exception
{
final JFrame frame = new JFrame("Main");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 100);
final Model model = new Model();
GuiPanel panel = new GuiPanel(model);
panel.init();
final Serializer serializer = new Serializer();
JButton button = new JButton("Save");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String xml = serializer.serialize(model);
// TODO: write str to disk
JOptionPane.showMessageDialog(frame, xml);
}
});
frame.add(panel, BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
frame.setVisible(true);
}
});
}
}