ボタンクリックで設計変更に応じるJava3D物体を作るには???

このQ&Aのポイント
  • ボタンをクリックすると、予めモニタ上のパラメータ欄に入力した数値に応じて、Java3D behaviorで描いた物体のサイズが変わるプログラムを作りたい。
  • しかし、設計変更後のデータの反映の方法や、CHANGEボタンをクリックする度に形状を変える方法、そして物体名称欄など入力しない箇所は変更できないようにする方法について困っています。
  • 完成イメージやソースコードは以下のサイトに掲載しています。
回答を見る
  • ベストアンサー

ボタンクリックで設計変更に応じるJava3D物体を作るには???

ボタンをクリックすると、予めモニタ上のパラメータ欄に入力した数値(半径・高さ・配置位置-X方向変位など)に応じて、Java3D behavior で描いた円錐・直方体・球のサイズが変るプログラムを作りたいと取り組み始めました。 しかし、下記の点などソースコードの具体的記述方法がわからず困っています。私が途中まで作成したソースコードのどの部分をどのように改めればよいか教えていただきたく、よろしくお願いします。 1) 入力した設計変更後データの反映のしかた(TextField欄の数値を条件変更後パラメータに与える方法) 2) CHANGEボタンをクリックする度に、設計パラメータに応じた形状に変える方法(Event処理のしかた) 更に、 3) 設計パラメータ一覧中で物体名称欄など入力しない箇所は変更できないように変える方法(現在は、TextFieldで記載しています。) 未完成の完成イメージとソースコードの何れも、下記のサイトに示します。 以上、よろしくお願いします。 URL: http://www.geocities.jp/java3dtest/QA06/question6.html

  • Java
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

>3. パラメータ・データを変更したい場合に、パラメータ一覧中のデータを入力し、これらデータを認識させる(データを変更しない場合も、改めて一覧中のデータを認識させる) R1,R2,R3,H1,H2,H3,D1,D3に入力欄の宣言時に初期値を与えておいて データ変更されたら読み込むようにすれば可能です。 final TextField tfield02a = new TextField("0.30", 16); R1 = 0.30f; tfield02a.addFocusListener( new FocusListener() {  public void focusGained(FocusEvent e) {  }  public void focusLost(FocusEvent e){   String r1 = tfield02a.getText();   R1 = Float.valueOf(r1); // float R1と宣言する必要はない(代入するだけで良い)  } }); 4,5についてはCHAGEボタンを押された時のEventとして createObjectsメソッドを呼べばどうにかなりそうな気がします。 まず、universeとrootの間に1つBranchGroup(仮にbgとします)をはさんで rootを更新することで描画し直す感じです。 Sample3Dのメンバ変数としてbgとrootを宣言します。 BranchGroup bg = new BranchGroup(); BranchGroup root = new BranchGroup(); それと private AmbientLight ambientLight = new AmbientLight(); これはprivateを取ってcreateObjectsメソッド内に入れて良いかと思います。 コンストラクタ内の最後あたりに root = createObjects(); bg.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); bg.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); bg.addChild(root); を追加して universe.addBranchGraph( createObjects() ); を universe.addBranchGraph(bg); に修正 またCHANGEボタンについては final Button addbutton = new Button("CHANGE"); addbutton.addActionListener(new ActionListener() {  public void actionPerformed(ActionEvent e) {   bg.removeChild(root);   root = createObjects();   bg.addChild(root);  } }); createObjectsメソッド内では rootを宣言した後にDETACHの許可を出します。 BranchGroup root = new BranchGroup(); root.setCapability(BranchGroup.ALLOW_DETACH); 初期条件の部分は全てコメントアウトにしても可。 条件変更後の部分のコメントをはずす。 こんな感じでしょうか…。

taihey
質問者

お礼

lailai2580さん、教えていただいた方法にて、取り組んできた回転機械の構造の3Dbehaviorプログラムにも使ってみました。 その結果、こちらの方も上手く作動して同様の結果を得ることができました。ありがとうございました。 尚、3Dbehaviorではなく、3DRotationInterpolatorで取り組んでいるプログラムにもトライしてみましたが、私の未熟さのためにまだできていません。しばらく、考えてみますが、また別の質問をさせていただくことになろうかと思います。また、よろしくお願いいたします。

taihey
質問者

補足

lailai2580さん、ありがとうございました。 お陰様にて今回の課題に対し私が掲げた問題点の全てを解決することができました。 教えていただいた記述を加えソースコードを変更し、第3回修正としてサイトに追加するとともに、イメージも最新修正版に置き換えました。 パラメータ・データを変更入力後にCHANGEボタンをクリックするとイメージが変わります。 本当にありがとうございました。 テーマ1件あたり同一の回答の方にはお礼ポイントは1件しか付けられないとのOKWaveの決まりがあるようですので最終回答 ANo.4 について贈らせていただきたいと思います。 尚、教えていただいた方法を目下取り組んでいる回転機械の構造を3Dbehaviorプログラムに早速適用させて同様の結果になるかトライしてみます。 また、近々今度は3Dbehaviorではなく、3D回転アニメーションに適用させたいと思いますが、behaviorとInterpolatorとではコーディングが多少異なると思いますので、また自分で解決できないときには機会を改めて教えていただくことになろうかと思います。そのときはよろしくお願いしまう。

その他の回答 (3)

回答No.3

No.1です。 修正版を拝見させて頂きました。 入力欄の背景色はsetBackgroundメソッドで指定可能です。 tfield00a.setBackground(Color.WHITE); といった感じです。 CHANGEボタンクリック後にオブジェクトの位置や大きさを変える方法は分かりませんが、 おそらく前回回答したactionPerformedメソッド内に処理を追加すれば良いかと思います。 円錐の位置を変えるのであれば、 Transform3D pos = new Transform3D(); coneGroup.getTransform(pos); // coneGroupにくっついているTransform3Dオブジェクトを取得 pos.setTranslation(new Vector3d(Double.parseDouble(tfield03.getText()), 0.0, 0.0)); // 位置変更 coneGroup.setTransform(pos); // 反映?? のような感じになりそうな気がします。 もちろん、coneGroupには coneGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); これをやっておく必要があります。 幅や高さを変更するにはオブジェクトを作り直すか、 Transform3DのsetScaleメソッドを使って頑張るしかないように思えます。

taihey
質問者

補足

lailai2580さん、早速、追加回答をいただきありがとうございました。 背景色につきましては、第2回修正欄に加えるとともにイメージ最新修正版に反映させました。 ありがとうございました。 CHANGEボタンのクリック後にオブジェクトの位置や大きさを変える方法について、Javaコードの記載方法の基本がわかっていない私ですが、自作の未完成ソースコードは以下のような考え方で構成させています。 1. 各オブジェクトに対するパラメータの初期値を予めプログラム内に与えておいて、この初期値に対応してグラフィック表示させておく 2. 同時に、この初期値はグラフィック上部のパラメータ一覧中に予め入力しておく 3. パラメータ・データを変更したい場合に、パラメータ一覧中のデータを入力し、これらデータを認識させる(データを変更しない場合も、改めて一覧中のデータを認識させる) 4. 全パラメータ・データをまとめて変更後データ群として、上記の1の初期値群と置き換える 5. CHANGEボタンをクリックした時点で、変更後データ群に基づくグラフィック表示をさせる 以上のような作業フローにて実行できるソースコードがJavaでできればと思うのですが、私は残念ながらコーディング方法に疎く、どのように記載していけばよいのか見当もつきません。 上記の1については、 private BranchGroup createObjectsコード内に「初期条件」として記載し、その後の各オブジェクトに対するプリミティブ・コントラクト(Cone、Box、Sphere)並びにVector3Dにデータとして与えるようにしています。 3については、例えば第1物体-円錐の半径であれば、public Sample3D中の下記部分でR1としてfloatデータとして認識させることができれば良いのではないかと考えました。 final TextField tfield02a = new TextField("0.30", 16); tfield02a.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { String r1 = tfield02a.getText(); float R1 = Float.valueOf(r1); } }); uppanels[2].add(tfield02a, BorderLayout.CENTER); 但し、この記述ではR1がfloatデータとして認識されているかどうかも不明です。 4については、3で全パラメータ・データを認識させた後、これらをprivate BranchGroup createObjectsコード内で、条件変更後のデータとして第1物体-円錐の半径(R1)であれば、Rconeに置き換えて変更後データ群とします。(これらデータは現ソースコードでは // を付して読み込まれないようにしています。) 5については、CHANGEボタンをクリックした時点で上気4の変更後データ群に置き換えるようなevent処理ができれば変更後のグラフィック表示ができるのではないかと考えましたが、そのようなことができるのかどうか不明です。 以上記載のように、Java初心者の私ですから、lailai2580さんから教えていただいたactionPerformedメソッド内の記述方法を理解できず、解決に向けて近づけることができていません。 もし、私が記載したような上記の作業フローに基づくソースコードで実現できそうでしたら、第2回修正欄の未完成ソースコードを直していただけるでしょうか? 或いは、実現不可でしたらlailai2580さんがANo.3で書かれた方法でプログラミングして示していただけるとありがたいのですが。 勝手なお願いで申し訳ありませんが、よろしくお願いいたします。

回答No.2

No.1です。 間違えましたので訂正を。 ×:actionPerformed(ActionEvent e){ ○:public void actionPerformed(ActionEvent e){

回答No.1

1については分からないので、2と3について答えたいと思います。 2. Event処理の仕方ですが、ActionListenerに登録するのはCHANGEのボタンだけで大丈夫です。 そのactionPerformedメソッドの中に1の処理を入れれば良いかと思います。 例えば final Button addbutton = new Button("CHANGE"); addbutton.addActionListener(new ActionListener() {  actionPerformed(ActionEvent e){   System.out.println(tfield00a.getText());  } }); と書けば、CHANGEボタンを押した時にコンソール上に「物体名称」という出力が得られます。 3. tfield00aの欄を変更できないようにするには、 tfield00a.setEditable(false); で可能です。

taihey
質問者

補足

lailai2580さん、訂正版ご回答も含めご親切な回答ありがとうございました。 お教えいただいた方法にて、質問した同じサイト(下記)に第1回修正としてソースコードと実行結果を加えました。また、イメージ欄には修正最新版を掲載しています。 3につきまして お教えいただいた方法にて、私の希望がかないました。 設計パラメータ一覧中で入力・変更したくない箇所をすべてを教えていただいた方法で直しました。これら箇所すべて背景色も「グレー」に変わり見やすくなりました。ありがとうございます。 但し、できることなら、入力・変更はしないですが、データ箇所の2ヶ所(第2物体に対する変位-X方向、第3物体に対する高さ(Y方向))の背景色をグレーとせずに、白色のままとすることが可能でしょうか? 1につきまして お教えいただいた方法にてソースコードを改めました。ご回答には「CHANGEボタンを押した時にコンソール上に「物体名称」という出力が得られます。」ということでしたが、サイトのイメージ/修正最新版 で「CHANGEボタン」を押してもこの画面上に変化が表示されません。尚、eclipseで実行をさせると確かにコンソール上に「物体名称」と出力されることを確認いたしました。 未回答の3につきまして、私の前回の質問内容がわかりにくかったかと反省し、改めて下記します。 「サイトのイメージ/修正最新版の画像で設計パラメータ一覧中データ(背景色が白色の箇所です)を変更後にCHANGEボタンをクリックすると設計パラメータ一覧中データに基づいて3D-behavior(物体上にマウスを載せ操作すると物体が動く)で描かれた3物体のサイズ、配置X方向位置が変化するようにしたい」というのが私の希望です。 これを実現する方法(ソースコードの変更)を教えていただけると、私が現在取り組んでいる別の物体形状(より複雑構造をしています)に対しても可能と考えています。 以上、是非ご教示ください。 URL: ​http://www.geocities.jp/java3dtest/QA06/question6.html

関連するQ&A

  • ボタンクリックで設計変更に応じるJava3D物体を作るには?(その2)

    ボタンをクリックすると、予めモニタ上のパラメータ欄に入力した数値(半径・高さ・配置位置-X方向変位など)に応じて、Java3D回転アニメーション(RotationInterpolator)で描いた円錐・直方体・円筒のサイズが変るプログラムを作りたいと取り組んでいます。 Java3D回転behaviorに対する同様の課題(QNo.4206209)では、lailai2580さんに教えていただき解決することができました。 このとき教えていただいたのと同様の方法を採り入れて、トライしてみました。下記URLに示すサイトでトライ1とトライ2をしてみました。 しかし、1物体(トライ2では中央に配置した赤直方体に対しパラメータ欄の第2物体-箱の設計条件を変えて「CHANGE」ボタンをクリックするとサイズが変るようになりましたが、他の2物体(右側の円錐、左側の円筒)を表示させることができません。 サイトのイメージに示す3物体何れに対しても設計条件を変えた後、「CHANGE」ボタンをクリックして、全ての物体に変化が生じ回転アニメーションを表示させるようにしたいのですが、今回は、3物体それぞれの回転数を変えるなどしており、BranchGroup を3つに分けて扱っていることなどがあって、Javaコーディングに疎い私は、ソースコードをどのように改めればよいかわかりません。 私が途中まで作成したソースコード(トライ2)のどの部分をどのように改めればよいか教えていただきたく、よろしくお願いします。 http://www.geocities.jp/java3dtest/QA08/question8.html

    • ベストアンサー
    • Java
  • ボタンクリックによる画像の変更

    はじめまして。 色々と調べたり考察してみたのですが方法が見つからないので質問致します。 □□□□ □□■□    ○ボタン □□□□    □、■=画像ファイル 同一フレームの中に上図のように数個の画像ファイルが並べてあります。 その横にボタンを配置します。 そのボタンをクリックすることで■の画像ファイルをAからBに変更すること可能でしょうか? また、可能であればその方法を教えて下さい。

    • ベストアンサー
    • HTML
  • vb2005でボタンクリックにより変更した内容を保存するには

    vb2005で、ボタンクリックをして変更した内容を保存、再びファイルを開いたときには変更した状態にしたいのですが、どのようにコード記述をすればよいかわかりません。たとえば、ボタンをクリックして複数ある白の背景色のラベルのうちいくつかの背景色を白から赤に変える、次に開いたときにはラベルは赤いままになっている、というようにしたいのです。どうぞご助言をください。

  • 複数のボタンを配置し、それぞれにイベント処理をつける

    よろしくお願いします。 javaを使った文字入力プログラムを作っているのですが、どうしても分からず質問させて頂きたいと思います。 「あ」から「ほ」までの合計30個のひらがなの文字が書かれたボタンを、5つ×6行で設置し、クリックするとそのボタンの文字がテキストボックスに入力される・・・という設計にしたいです。 もちろん1つずつソースを書けばできるのですがそれではコードが冗長になってしまうので、できるだけ簡略化してループ処理などで実現できればと考えています。 設置するボタンはひらがなボタン30個に加え、テキストボックスをリセットするボタン、クリックするとダイアログメッセージを表示させるボタンの計32個です。 時分でもいろいろ調べてみたのですが分からずじまいです。 どうかよろしくお願いいたします!

    • ベストアンサー
    • Java
  • Java3Dにおける再描画

    Java3Dで,例えば. (1.0+x,1.0+y,1.0+z)のBOXを,ボタンを押すごとにx,y,zにランダムの数値が入れ形状を変化させるプログラムを作りたいのですが,再描画の方法がわかりません. どなたか教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • Java3D(アプレット)で作成した横置き回転スクリュー軸のパラメータ授受

    前回の質問「HTMLで設定したPARAM値(半径と高さ)を認識できず3Dで円筒表示しません」(QNo.4083743)に続いての質問です。 今回は、Java3D、アプレット方式にて、1つの円筒と2つのスクリュー(TriangleStripArrayを使い作成)で構成される横置きスクリュー軸を作り、更にRotationInterpolatorを使い回転アニメーションのプログラムソースを完成させました。(下記URLのNo1) 前回同様、htmlファイル側のパラメータタグ<param name=" " value=" ">でスクリューの内半径、外半径、長さ、巻数などの値を与えて、プログラム側initメソッドで getParameterを使いこれらデータを受けとり、スクリュー形状などを変えて表示させたいと考え、パラメータの授受部分をinitメソッド部分に加えました。(下記URLのNo2とNo3) ところが、今回もinitメソッドより先に形状作成部分、回転アニメーション表示部分が実施されてしまうのかNo1で表示されるようは表示できません。 No2は、形状作成部分にパラメータで授受すべき値の一部を与えて、「アプレットは初期化されていません」のメッセージは表示されないようにはしましたが、暗黒画面のみでスクリュー軸は表示されません。 No3は、形状作成部分にパラメータで授受すべき値全てを与えて、No1と同じように表示させましたが、これではパラメータからの授受にはなっていません。 前回は、lailai2580 さんに、java初心者の私が作成中の未完成プログラムソースに手を加えていただき、パラメータ授受させて表示するようにしていただきましたが、そのときの教えを応用させることができずに、今回も教えていただきたくお願いします。 下記サイトのNo3プログラムソース(Sample3D.java)で、どの部分をどのように改めればよいか、具体的に示していただきたく、よろしくお願いします。 URL: http://www.geocities.jp/java3dtest/QA03/question3.html

    • ベストアンサー
    • Java
  • radioボタンクリック時textボックスを有効にしたい

    どなたか教えて下さい。 radioボタンクリック時に入力不可のtextボックスから入力可能なtextボックスへ変更したいです。 JavaScriptのみで可能な方法がありましたら教えて下さい。 よろしくお願いします。

  • Java3Dで積み木

    はじめまして。 java3Dを使って、(子供が遊ぶような)積み木プログラムが作りたいと考えています。 ブロックを積む作業、移動させたり、回転させたり、は実現できそうな感じなのです。 が、積み木を任意の時点で(例えばパネルを用意してそこのボタンをクリックする)3D画面に追加するようにすることはできるのでしょうか? Javaはシーングラフが、ライブ状態になると、ノードの追加ができないですよね? 何か上手な方法はないでしょうか??行き詰って困っています↓↓

  • フォームボタンクリックでセル色表示

    作業中中断により日付を変更したのかどのボタンまでクリックしたのかがわからなくなります。 A2セルの日付を変更したらB5セルが赤表示、ボタン1をクリックしたらC5セルが青表示、ボタン2をクリックしたらD5セルが緑表示、ボタン3をクリックしたらE5セルが黄表示等どこの作業まで実施したのかわかるようにしたいのですがVBAのコードがお解りになる方よろしくお願いします。

  • 「ログアウト」ボタンを設計するとき、あなたはどんな挙動を考えますか

    みなさんは「ログアウト」というボタンをクリックしたら、どのような挙動をするのが好ましいと考えますか? たとえば みなさんはあるシステムの画面設計をしているとします。 デスクトップ上のアイコンをダブルクリックして起動すると最初に表示される 「スタート」画面でIDとパスワードを入力して「ログイン」ボタンをクリックすると システムにログインするという風に設計したとします。 システム内のある画面上に「ログアウト」というボタンを置くとして とくに顧客からの要望や上司からの指示がなければ、あなたはそのボタンをクリックしたら どのような動きをさせようと考えますか? 1.システムを終了させてデスクトップが表示されるようにする。 2.システムは終了させないが、IDとパスワードで保護されていない「スタート」画面が表示されるようにする。 3.その他(自由に記述して下さい)。 私は2.を支持します。1.のようにシステムを終了させるならボタンの標記を「システム終了」にします。 私は「ログアウト≠システム終了」の考えです。 ところが私の職場の同僚や上司はみんな1.を支持してて 「ログアウトもシステム終了も一緒だ」という考えで、これがどうしても納得がいきません。 それで私は今開発中のシステムのログアウトボタンの標記を「システム終了」に変えました。 パソコン用語辞典などではログオフ=ログアウトであり 1と2のどちらの意味もあるとありますが 私は色々なサイトの会員サービスの「ログアウト」ボタンをクリックすると IDとPWの入力フィールドとログインボタンが隅っこにある トップページに戻ることが多いという経験的観念から2.を支持します。 2.を支持する私に1を説明するのも結構です。 1ヶ月くらいは締め切らないで、いろいろな意見を聞きたいです。

専門家に質問してみよう