0

いくつかの投稿を検索しましたが、プログラムを動作させることができません。ここに問題があります----カラーキューブと保存ボタンを表示するクラスがあります。保存ボタンは、後で使用するためにjava3dオブジェクト(ここではカラーキューブ)をオブジェクトファイルに保存するためのものです。

オブジェクトファイルが作成されましたが、2〜3行を除いて空のようです。ぜひご覧ください ---

public class Rotation extends Applet implements ActionListener {

//---- Attribute -----------------------
private SimpleUniverse universe;
private Canvas3D canvas3D;
private static Frame frame;
BranchGroup szene = new BranchGroup(); 
TransformGroup objDreh = new TransformGroup();
ColorCube cube = new ColorCube(0.4);

public Rotation() 
{}

public void init() {
setLayout(new BorderLayout());
JPanel panel = new JPanel();
JButton btn = new JButton("Save");
btn.addActionListener(this);
panel.add(btn);
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
canvas3D = new Canvas3D(config);
add(canvas3D, BorderLayout.CENTER);
add(panel, BorderLayout.SOUTH);
szene = macheSzene();
szene.compile();
universe = new SimpleUniverse(canvas3D);
universe.getViewingPlatform().setNominalViewingTransform();
universe.addBranchGraph(szene);
}

/**
 * Erstellt den Szenegraphen
 * 
 * @return BranchGroup
 */
public BranchGroup macheSzene() {
BranchGroup objWurzel = new BranchGroup();
// Transformation, 2 Rotationen:
Transform3D drehung = new Transform3D();
Transform3D drehung2 = new Transform3D();
drehung.rotX(Math.PI / 4.0d);
drehung2.rotY(Math.PI / 5.0d);
drehung.mul(drehung2);
objDreh = new TransformGroup(drehung);
TransformGroup spin = new TransformGroup();
spin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
spin.addChild(cube);
objDreh.addChild(spin);
objWurzel.addChild(objDreh);

// Drehung
Alpha spinAlpha = new Alpha(-1, 5000);
RotationInterpolator dreher = new RotationInterpolator(spinAlpha, spin);
BoundingSphere zone = new BoundingSphere();
dreher.setSchedulingBounds(zone);
spin.addChild(dreher);

return objWurzel;
}

/**
* gibt speicher frei
*/
public void destroy() {
universe.removeAllLocales();
}


@Override
public void actionPerformed(ActionEvent e) 
{
    try {
        writeIntoFile();
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Rotation.class.getName()).log(Level.SEVERE, null, ex);
    }

}

public void writeIntoFile() throws FileNotFoundException
{
    //throw new UnsupportedOperationException("Not supported yet.");
    SerializeObject obj = new SerializeObject(cube);
    try {
        FileOutputStream out = new FileOutputStream("e://j3dObjects.xml");
        try {
            ObjectOutputStream sout = new ObjectOutputStream(out);
            sout.writeObject(obj);
            sout.close();
        } catch (Exception err)
            { err.printStackTrace(); }
    }  catch(Exception err)
    { err.printStackTrace(); }     
}




public static void main(String[] args) {
frame = new MainFrame(new Rotation(), 500, 500);
frame.setTitle("Rotation");
}

}

そしてシリアライズ可能なクラス-------

public class SerializeObject extends ColorCube implements Serializable {

ColorCube cb;


SerializeObject(ColorCube brn)
{
    this.cb = brn;
}   
}

見てください、そして私が間違っているところを教えてください。もう1つ、トランスフォームグループをオブジェクトファイルに書き込むことは可能ですか? ありがとう。

4

2 に答える 2

1

オブジェクトをシリアライズするには、そのすべてのフィールドがシリアライズ可能 (ここではColorcube) であるか、宣言されている必要がありますtransientColorCubeコードを機能させるには、がシリアライズ可能であること (つまり、Serializableインターフェースを実装していること)を確認してください。

于 2013-01-16T07:19:38.800 に答える
0

オブジェクトをSerizlizingするときは、各属性をどうするかを決定する必要があります。ここに2つの主なオプションがあります:

1)シリアル化する:この属性のクラスがシリアル化可能(またはプリミティブ型)を実装する場合は問題ありません。そうでない場合は、シリアル化する方法(シリアル化可能を実装する)をコーディングする必要があります。

2)この属性をシリアル化しないでください。一時キャッシュなど(このオブジェクトの状態を表さない)であるためにこの属性をシリアル化したくない場合は、この属性にマークを付けることができtransient、この属性はシリアル化されません。この場合、この属性をシリアル化する方法について心配する必要はなく、そのクラスはシリアル化可能を実装する必要はありません。

于 2013-01-16T07:31:10.783 に答える