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表示をするフレームを開いています。
親フレームはこちらを参照してください。
サンプルプログラム
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