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

[Java3Djp:01433] J3DGraphics2D



------------  質問: プロフェッショナルに転職できるのは?  ------------
                  ?
            答え: アジアネット!!
     〜プロフェッショナルのためのリクルーティングサイト〜
------ http://www.asia-net.com/jp/jobsearch.php3?community=AsiaKK ------



はじめまして、江本と申します。

【質問】
J3DGraphics2D の使用法が良く分からなくて困っています。
どうやって使えばよいのでしょうか?

【詳細】
現在Java3Dでアプリケーションを作成しています。このアプリケーション中で
部品をクリックするとその部品名が表示するようにしたいのですが、Java3D1.2
からJ3DGraphics2Dというクラスが追加されたことを知り、これが利用できるか
と思ってテストしてみたのですが、うまく行きません。

ソース全部を送信するわけには行かないのですが、主要な点だけを言うと、
下記の様ににCanvas3Dのサブクラスを作成し、ここで3Dの表示を行い、
void postRender()で部品名を上書きするようにしました。

ところが、実際に動かしてみるとクリックした後、5秒くらいたってから
(おそらくレンダリング終了後、適当なタイミングで)初めて部品名が表示されます。
これをすぐに表示させるようにするにはどうしたらよいでしょうか?


package nifs.j3d;
import javax.media.j3d.*;
import java.awt.*;

class MyCanvas3D extends Canvas3D {
    String name = null;
    int x;	
    int y;
    MyCanvas3D(java.awt.GraphicsConfiguration conf){
	super(conf);
    }
    
    public void setLabel(int x,int y,String s){
	name = s;
	this.x = x;
	this.y = y;
    }
    
    public void clearLabel(){
	if ( name != null ){
	    J3DGraphics2D g = getGraphics2D();
	    g.flush(false);
	}
	name = null;
    }
    
    public void postRender(){
	if ( name != null ){
	    J3DGraphics2D g = getGraphics2D();
	    Font font = new Font("Dialog", Font.PLAIN, 12);
	    FontMetrics fm = g.getFontMetrics(font);
	    int width = fm.stringWidth(name);
	    int height = fm.getHeight();
	    int ascent = fm.getMaxAscent();
	    g.setFont(font);
	    g.setColor(Color.white);
	    g.fillRect(x,y,width,height);
	    g.setColor(Color.red);
	    g.drawString(name,x,y+ascent);
	    g.flush(false);
	}
    }
}