ともさんのHP >プロブラミング >JavaFX >SwingイベントでFXデータを扱う

SwingイベントでFXデータを扱う

前回、SwingアプリにFXを追加、こちらをしました。 今回、Swingのイベントの中でFXのデータを扱おうとすると、上手く動きませんでした。
具体的には、前回作ったJframeの中のSceneをSubSceneに置き換え、Jframeのサイズ変更に従ってSubSceneの大きさを変えたかったのです。
FXが含まれなければ、下記のclassをJframeに加えればよいのですが、これでは正常に動いたり動かなかったりします。

広告

class frameEvent implements ComponentListener{
//フレームのサイズが変わったら、これに合わせてサブシーンのサイズを変える
 public void componentResized(ComponentEvent e) {
    FxFrame2.this.s3d.setHeight( FxFrame2.this.getHeight() -27 );
    FxFrame2.this.s3d.setWidth( FxFrame2.this.getWidth() - 100 -8 );
 }
 public void componentMoved(ComponentEvent e) {}
 public void componentShown(ComponentEvent e) {}
 public void componentHidden(ComponentEvent e){}
}

対策として、FXを含む処理を下のようにコードをRunnableオブジェクト内にラップし、Platform.runLaterメソッドをコールすればOKです。

  Platform.runLater(new Runnable() { 
   public void run() {
    FxFrame2.this.s3d.setHeight( FxFrame2.this.getHeight() -27 );
    FxFrame2.this.s3d.setWidth( FxFrame2.this.getWidth() - 100 -8 );
  }});

こちら を参考に作成しました。

実行結果

下のサンプルプログラムを実行すると下記のようになります。
親フレームをまず開き、そこからFX3D表示をするフレームを開いています。
親フレームはこちらを参照してください。
SwingイベントでFXデータを変更する方法


広告

サンプルプログラム


package tomojavalib.fx;

import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowListener;

import javax.swing.Jframe;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Point3D;
import javafx.scene.Camera;
import javafx.scene.Group;
import javafx.scene.LightBase;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.Scene;
import javafx.scene.SubScene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import tomojavalib.p2cad.*;


public class FxFrame2 extends Jframe {
SubScene s3d =null;

public FxFrame2( Frame f ){
 this.setBounds(50,50,320,240);
 this.setBackground(java.awt.Color.WHITE);
 //タイトル
 this.setTitle("サブスクリーンの大きさ変更");
 JFXPanel fxPanel = new JFXPanel();
 Pane pane = new Pane();
 s3d = this.createScene(); 
 pane.getChildren().add( s3d );
 Scene scene = new Scene( pane );
 fxPanel.setScene(scene);
 this.add(fxPanel);
 //イベント処理
 addComponentListener(new frameEvent());
 this.setVisible(true);


class frameEvent implements ComponentListener{
//フレームのサイズが変わったら、これに合わせてサブシーンのサイズを変える
 public void componentResized(ComponentEvent e) {
  Platform.runLater(new Runnable() { 
   public void run() {
    FxFrame2.this.s3d.setHeight( FxFrame2.this.getHeight() -27 );
    FxFrame2.this.s3d.setWidth( FxFrame2.this.getWidth() - 100 -8 );
  }});
 }
 public void componentMoved(ComponentEvent e) {}
 public void componentShown(ComponentEvent e) {}
 public void componentHidden(ComponentEvent e){}
}

private SubScene createScene() {
 Group group = new Group();
 //箱を置く
 Box box = new Box( 10 , 10 , 10 );
 box.setRotationAxis( new Point3D( 1.5 , 1.5 , 1.5 ) );
 box.setRotate( 45.0 );
 group.getChildren().add( box );
 // カメラを置く
 Camera camera = new PerspectiveCamera( true );
 camera.setTranslateZ( -50.0 );
 group.getChildren().add( camera );
 //点光源を置く
 LightBase light = new PointLight();
 light.setTranslateX(  30.0 );
 light.setTranslateY( -30.0 );
 light.setTranslateZ( -30.0 );
 group.getChildren().add( light );

 SubScene  scene  =  new  SubScene( group , this.getHeight() -27 , this.getWidth() - 100 -8 );
 scene.setCamera( camera );
 scene.setFill(Color.BLACK);
 scene.relocate(100.,0);
return (scene);
}

}


最終更新日: 2019-02-07 08:08:58

ともさんのHP >プロブラミング >JavaFX >SwingイベントでFXデータを扱う

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

庭園図集  
RPGゲーム風の服  
JavaFX基本コード  
木製プランターの自作  
各種Pane  
さくら草の栽培、手入れ、増やしかた  
2DSceneと3DSceneを同時に表示  
ラウンドアップを使って木を枯らす  
袴の作り方  
蜂舎のこと  
Raspberry Piを太陽電池に接続  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます