2010-04-26 3 views
3

Мне удалось выполнить сериализацию моего самого базового GUI-объекта, содержащего JTextArea и несколько кнопок, в файл test.ser.Восстановить ранее сериализованный JFrame-объект, как?

Теперь я хотел бы полностью восстановить ранее сохраненное состояние из test.ser, но, похоже, имеет неправильное представление о том, как правильно десериализовать состояние объектов.

Класс MyFrame создает JFrame и сериализует его.

public class MyFrame extends JFrame implements ActionListener { 


// Fields 
JTextArea textArea; 
String title; 
static MyFrame gui = new MyFrame(); 
private static final long serialVersionUID = 1125762532137824262L; 


/** 
    * @param args 
    */ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    gui.run(); 
} 

// parameterless default contructor 
public MyFrame() { 

} 

// constructor with title 
public MyFrame(String title) { 

} 

// creates Frame and its Layout 
public void run() { 

    JFrame frame = new JFrame(title); 
    JPanel panel_01 = new JPanel(); 
    JPanel panel_02 = new JPanel(); 

    JTextArea textArea = new JTextArea(20, 22); 
    textArea.setLineWrap(true); 

    JScrollPane scrollPane = new JScrollPane(textArea); 

    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 

    panel_01.add(scrollPane); 



    // Buttons 
    JButton saveButton = new JButton("Save"); 
    saveButton.addActionListener(this); 
    JButton loadButton = new JButton("Load"); 
    loadButton.addActionListener(this); 


    panel_02.add(loadButton); 
    panel_02.add(saveButton); 
    // Layout 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(BorderLayout.CENTER, panel_01); 
    frame.getContentPane().add(BorderLayout.SOUTH, panel_02); 

    frame.setSize(300, 400); 
    frame.setVisible(true); 
} 

/* 
    * 
    */ 
public void serialize() { 

    try { 
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.ser")); 
    oos.writeObject(gui); 
    oos.close(); 
    } catch (Exception e) { 
    // TODO: handle exception 
    e.printStackTrace(); 
    } 
} 


public void actionPerformed(ActionEvent ev) { 
    System.out.println("Action received!"); 
    gui.serialize(); 
} 

} 

Здесь я пытаюсь сделать десериализации:

public class Deserialize { 
static Deserialize ds; 
static MyFrame frame; 



public static void main(String[] args) { 
    try { 
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.ser")); 
    frame = (MyFrame) ois.readObject(); 
    ois.close(); 
    } catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
} 

Может быть, кто-то может мне точку в направлении, где моя заблуждением является?

Как вы, ребята, напишите класс, который десериализует и восстанавливает ранее сериализованные gui-элементы в их ранее сериализованном состоянии?

То, как я делаю это сейчас, похоже, имеет более одного недостатка в его концепции, не так ли?

ответ

1

Что происходит? Вы получаете исключение? Из внешнего вида кода ds никогда не инициализируется. Я считаю, что после десериализации вам нужно будет показать рамку с frame.setVisible(true);. Как всегда, Swing (и на самом деле AWT) следует использовать только на AWT Event Dispatch Thread (EDT) - используйте java.awt.EventQueue.invokeLater.

Вообще использование статики - не очень хорошая идея. Также не выполняется сериализация компонентов GUI. final хорош, и, по большей части, убедитесь, что инициализированы экземпляры и статические поля.

+0

Да, я сделал. Я получил исключение NullPointerException. Я просто изменил код на то, что вы видите сейчас. Больше не появляется сообщение об ошибке, но все же gui не получает десериализацию. – jottr

+0

Я думаю, вам нужно показать фрейм. –

+0

просто добавил его в начальный пост – jottr

0

Как говорится в каждом компоненте качания javadoc, предпочтительный способ сериализации JFrame, а другие JFoo - это XMLEncoder.

Классическая сериализация работает в некоторых приложениях с графическим интерфейсом, но не с приложениями с графическим интерфейсом с длительным сроком службы.

Смежные вопросы