2011-08-14 8 views
0

LookAndFeelインターフェイスのコピーをファイルにシリアライズする必要があります。シリアライズ可能なLookAndFeel - ClassCastException

public class SerializableLookAndFeel extend LookAndFeel implement Serializable { 
    public String getID() { 
     return ""; 
    } 
    public String getDescription() { 
     return ""; 
    } 
    public String getName() { 
     return ""; 
    } 
    public boolean isSupportedLookAndFeel() { 
     return false; 
    } 
    public boolean isNativeLookAndFeel() { 
     return false; 
    } 
} 

ランタイム私はスレッドで

例外を取得しますが、 "メイン" とjava.lang.ClassCastException: javax.swing.plaf.metal.MetalLookAndFeel結果として、私は次のコードを書いています test.SerializableLookAndFeel

にキャストすることはできません私ははMetalLookAndFeelを拡張しようとしたが、実行時に、私はClassCastExceptionが取得します。

どうすればLookAndFeelをファイルにシリアル化できますか?パラメータとしてSet the Look and Feel

答えて

1

まず、私が想定しそれはタイプミスで、extendsextendではありませんでした。 LookAndFeelクラスは、直接と知られているサブクラスBasicLookAndFeelMultiLookAndFeelを持っています。

例外として、SerializableLookAndFeelMetalLookAndFeelをキャストしようとしています。 SerializableLookAndFeelLookAndFeelになりますが、MetalLookAndFeelBasicLookAndFeelになります。効果的には、あなたのクラスに兄弟の子供を割り当てようとしていますが、これはうまくいかないでしょう。

問題が引き続き発生する場合は、BasicLookAndFeelを延長してください。テストコードを投稿してください。

+0

私がやろうとしていることは、私のPCから私の現在の外観を取得し、起動するたびにこの設定をアプリケーションにロードさせることです。だから、私はバイナリオブジェクトとして保存することに決めました。しかし、あなたが示唆していることをするには問題があります - あなたはBasicLookAndFeelのようなことはできませんlookAndFeel = UIManager.getLookAndFeel(); IDEは私をさせません。 – ilja

+0

'UIManager.getLookAndFeel()'は、LookAndFeelを返します。これは、Abstractクラスです。あなたはコードがうまくいくはずです、キャストしようとしましたか? 'BasicLookAndFeel lookAndFeel =(BasicLookAndFeel)UIManager.getLookAndFeel();'どのIDEを使用していますか?実行できるコードを投稿できますか?私はコードを見ることなく大いに役立つことはできません。また、問題が解決しない場合は、デバッガを見て、 'getLookAndFeel()'が何を返すかを見てください。 – Ali

+0

'public static void main(String [] args)例外をスローする{ JFrame frame = new JFrame(" Test "); frame.setSize(600、400); TextArea textArea = new TextArea(20、10); frame.add(textArea); frame.setVisible(true); BasicLookAndFeel blaf =(BasicLookAndFeel)UIManager.getLookAndFeel(); s(blaf); } パブリックstatic void(BasicLookAndFeel blaf){ try { FileOutputStream fout = new FileOutputStream( "basiclook.dat"); ObjectOutputStream oos =新しいObjectOutputStream(fout)。 oos.writeObject(basicLookAndFeel); oos.close(); } catch(例外e){ e.printStackTrace(); } } ' java.io.NotSerializableException:java.lang.Object.IDEAを使用します – ilja

1

1)単にタイプミス:-)ないextend LookAndFeelしかしextends LookAndFeel

2)ではない良いアイデア、あなたのL & Fの変化がなければならないことを確認してください。

try { 
    UIManager.setLookAndFeel(laf[index].getClassName()); 
    SwingUtilities.updateComponentTreeUI(frame); 
    //or SwingUtilities.windowForComponent(myComponent) 
} catch (Exception exc) { 
    exc.printStackTrace(); 
} 
+0

1)実際のコードでは1)タイプミスはありません。問題はまだ実際です – ilja

1

あなたは奇妙なことをしています。 SerializableLookAndFeelMetalLookAndFeelの兄弟であるため、キャストは機能しません。

MetalLookAndFeelLookAndFeelを拡張しSerializableを実装BasicLookAndFeelを拡張するので、再度Serializableを加えることにはポイントがありません。

それをそのままシリアル化しようとするとどうでしょうか?何が起こるのですか?

あなたは本当にルックス&をシリアル化する必要がありますか?単にその名前(または何でも)を保存しないのですか?

+0

MetalLookAndFeelのようなことはできません。lookAndFeel = UIManager.getLookAndFeel(); – ilja

関連する問題