[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:00196] Java3D とSwing について



◆『世界各国経済情報ファイル』「The World 98 CD-ROM」◆=========
      
     ★ 世界各国の経済・地理・社会の様々なデータを収録!
         ★ コピー&ペースト、ダウンロード機能でとっても便利!!
 
 <<節分特別セール 定価 6,800円 → 4,800円(税、送料込み)>>
   お問い合わせ先:日本データベース開発(株) kanzaki@xxxxxxxxxx 
============== http://www.ndk.co.jp/06SUBM/saisin.html ==============

はじめまして、池田といいます。よろしくおねがいします。

開発環境は、JDK1.2 + Java3D1.1 + Windows95 です。

現在、Swing上でJava3Dの表示を行っているのですが表示がおかしくなって困っています。
具体的には、JDesktopPane上にJava3Dを表示するJInternalFrameをいく枚か表示させる
アプリケーションなのですが、JInternalFrame同士が重なると重なった部分のフレームの
枠が表示されません。また、フレームを移動するとJava3Dのパネルが遅れて移動します。
これはもしかして、Lightweight ComponentとHeavyweight Component の混在という問題
なのでしょうか。もしそうだとしたら、回避方法は存在するのでしょうか。
アドバイスお願いします。
参考のためにサンプルコードを添付します。

--------------------------------------------------------------------------------

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.mouse.*;

class Test1 {

    public static void main( String[] args ) {
        JFrame frame = new JFrame( "Java3D Test1" );
        JDesktopPane desktop = new JDesktopPane();
        frame.getContentPane().add( desktop , BorderLayout.CENTER );
        frame.setSize( 500 , 500 );
        frame.setLocation( 100 , 100 );
        frame.setVisible( true );

        JIFrame f1 = new JIFrame( "Frame1" );
        f1.setBounds( 20 , 20 , 300 , 300 );
        desktop.add( f1 );
        f1.setVisible( true );

        JIFrame f2 = new JIFrame( "Frame2" );
        f2.setBounds( 100 , 100 , 300 , 300 );
        desktop.add( f2 );
        f2.setVisible( true );
    }
}

class JIFrame extends JInternalFrame {

    public JIFrame( String title ) {
        super( title );
        JPanel panel = getJ3DPanel();

        setClosable( true );
        setMaximizable( true );
        setIconifiable( true );
        setResizable( true );
        getContentPane().add( panel , BorderLayout.CENTER );
    }

    JPanel getJ3DPanel() {

	    JPanel panel = new JPanel();

	    panel.setLayout(new BorderLayout());

        Canvas3D canvas = new Canvas3D( null );
	    panel.add( "Center" , canvas );

        SimpleUniverse universe = new SimpleUniverse( canvas );

        BranchGroup root = createSceneGraph();

        universe.getViewingPlatform().setNominalViewingTransform();
        universe.addBranchGraph( root );

        return panel;
    }

    BranchGroup createSceneGraph() {

        BranchGroup objGroup = new BranchGroup();

        TransformGroup objTrans = new TransformGroup();
        Transform3D translation = new Transform3D();
        objTrans.setTransform( translation );

        Shape3D shape = new ColorCube( 0.5 );

        objTrans.addChild( shape );

	    objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
	    objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
	    objGroup.addChild( objTrans );

        setMouseBehavior( objGroup , objTrans );

        return objGroup;
    }

    private void setMouseBehavior( BranchGroup root , TransformGroup trans ) {

        MouseBehavior behavior1 = new MouseRotate();
        behavior1.setTransformGroup( trans );
        root.addChild( behavior1 );
        MouseBehavior behavior2 = new MouseTranslate();
        behavior2.setTransformGroup( trans );
        root.addChild( behavior2 );
        MouseBehavior behavior3 = new MouseZoom();
        behavior3.setTransformGroup( trans );
        root.addChild( behavior3 );
        BoundingSphere bounds=new BoundingSphere( new Point3d( 0.0,0.0,0.0 ) , 100.0 );

        behavior1.setSchedulingBounds( bounds );
        behavior2.setSchedulingBounds( bounds );
        behavior3.setSchedulingBounds( bounds );
    }
}

---------------------------------------------------------------
池田 隆志 ( E-Mail : ikeda@xxxxxxxxxx )
      (株)NEC情報システムズ