Не уверен, как получить объект для отображения после загрузки из ObjectInputStream () - PullRequest
2 голосов
/ 14 июня 2010
public void load()
{
    final JFileChooser fc = new JFileChooser();
    int returnVal = fc.showOpenDialog(this);
    if(returnVal == JFileChooser.APPROVE_OPTION)
    {
        try{
            FileInputStream f_in = new FileInputStream(fc.getSelectedFile());
            ObjectInputStream obj_in = new ObjectInputStream(f_in);
            Frame f2 = (Frame)obj_in.readObject();
            obj_in.close();
            f2.setVisible(true);
        }
        catch(Exception ex){
        }
    }
}

1 Ответ

1 голос
/ 14 июня 2010

Я бы попытался добавить вызов метода pack в кадре перед вызовом setVisible . Это должно сделать его отображаемым и иметь правильный размер.

FileInputStream f_in = new FileInputStream(fc.getSelectedFile());
ObjectInputStream obj_in = new ObjectInputStream(f_in);
Frame f2 = (Frame)obj_in.readObject();
obj_in.close();
f2.pack()
f2.setVisible(true);

Если это не работает, проверьте возвращаемое значение f2.isDisplayable () после вызова pack . Если значение равно false, это означает, что фрейм не подключен к собственному экранному ресурсу (о котором, я думаю, pack должен позаботиться, но я не уверен в этом в сценарии десериализации).

Другая проблема может заключаться в несовместимости между JVM, которая сериализовала кадр, и той, которая десериализует его, если кадр включает компоненты Swing. В javadocs для компонентов Swing есть предупреждения о переключении версий JVM при использовании для них сериализации.

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

...