2012-01-24 3 views
0

몇개의 JInternalFrames를 가지는 JDesktopPane를 포함한 JFrame를 직렬화하려고하고 있습니다. CrossPlatform LnF와 다른 Swing 구성 요소를 직렬화 할 수 없기 때문에 LookAndFeel에 문제점이 발생했습니다. 그래서 나는 나의 possibilites을 파악하기 위해이 테스트 프로그램을 작성 :LookAndFeel을 사용한 JFrame 직렬화

public static void main(String[] args) {  
    try { 
     JFrame f = new JFrame(); 
     f.setBounds(200,200,200,200); 
     JTree tree = new JTree(); 
     f.add(tree); 
     f.setVisible(true); 

     UIManager.setLookAndFeel(
        UIManager.getCrossPlatformLookAndFeelClassName()); 
     SwingUtilities.updateComponentTreeUI(f); 

     ObjectOutputStream oop = new ObjectOutputStream(
        new FileOutputStream(new File("test.serialized"))); 
     oop.writeObject(f); 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (UnsupportedLookAndFeelException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

이 두 가지 이유로 작동하지 않았다 :

  1. 나는 프레임과 포함 된 트리를 직렬화 할 수 없습니다입니다. 그냥 나무 괜찮아요하지만 때 그냥
  2. 내가 먼저 LookAndFeel 크로스 플랫폼을 설정하고 나중에 내 나무를 만듭니다.

어떤 문제 해결 방법이 있습니까?

편집 : 이 부분을 분명히하기 위해 죄송합니다. LnF 또는 이와 비슷한 것을 직렬화하려고하지 않습니다. LnF가 프레임을 serialize하지 못했습니다.

java.io.NotSerializableException: com.apple.laf.AquaTreeUI 

그리고 그 위에

내가 나무를 포함하는 프레임을 직렬화 할 수 없습니다입니다.

Exception in thread "AWT-EventQueue-0" java.lang.InternalError: incorrect component 
+1

JDesktopPane 구현에는 직렬화 할 수없는 일부 LnF 구성 요소가 포함될 가능성이 큽니다. 일반적으로 관심있는 상태를 다른 방식으로 저장하는 것이 좋습니다. 저장 상태에 따라 UI를 다시 작성하는 코드를 작성하는 것이 좋습니다. – technomage

+0

왜 Swing 구성 요소를 직렬화 하시겠습니까? 재앙을위한 조리법처럼 들립니다. – Charlie

답변

0

체크 this. @SoboLAN에 의해 ​​제안 된 구현입니다.

2

시도하는 것은 불가능합니다. JFrame 객체를 직렬화하면 LnF가 어떤 식으로도 직렬화되지 않습니다. 이는 JFrame이이 메모리를 기억하지 않기 때문입니다. 어떤 LnF가 사용되는지는 다른 곳에 저장됩니다 ...

JFrame을 다른 객체로 랩핑하는 것은 MyGUI라고 가정 해 봅시다. 그 안에는 LnF (예 : String)를 비공개 필드에 저장합니다. 결국 MyGUI를 직렬화하고 deserialization 할 때 LnF를 좋고 그대로 유지하고 다시 설정할 수 있습니다.

+0

내 문제는 내가 LnF를 직렬화하고 싶지 않다는 것입니다. JFrame과 포함 된 요소를 직렬화하려고하지만 LnF가 저에게 그렇게하기를 원하지 않습니다. java.io.NotSerializableException : com.apple.laf.AquaTreeUI – mxcd

+0

@ maximilian009 JFrame 클래스와 JTree 클래스는 모두 직렬화 가능합니다 (문서) 그래서 ... 이것은 조금 이상합니다 ... –

+0

알아요. 그것이 내가이 글을 게시하는 이유입니다 ... – mxcd