SwingアプリにFXを追加する方法
洋裁CADはSwingで記述してきた2次元CADですが、3D化するためにJavaFXを使うことにしました。
本来であれば全てFXで書きなおしてしまえばよいのですが、そんなに時間は持ち合わせていません。
全体のFX化はボチボチやっておくことにして、とりあえず、部分的にFXを使って3Dを表示できるように考えました。
具体的にはSwingのフレームからFXのStageを呼び出し、データを渡したかったのですが...。
JframeからStageは開けない
やってみたらダメでした。
Jframeの中にjavafx.embed.swing.JFXPanelを置き、その中にSceneを配置。これで実現できました。
こちら
を参考に作成しました。
構造はこんな感じになります。
実行結果
下のサンプルプログラムを実行すると下記のようになります。
親フレームをまず開き、そこからFX3D表示をするフレームを開いています。
サンプルプログラム
親フレーム
package tomojavalib.fx;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.Jframe;
public class Frame extends Jframe {
public Frame(){
this.setSize(320,240);
this.setVisible(true);
this.setTitle("親フレーム");
FxFrame fxframe = new FxFrame();
}
public static void main(String[] args) {
Frame f = new Frame();
}
}
親フレームから呼び出される3D表示フレーム
package tomojavalib.fx;
import javax.swing.Jframe;
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.paint.Color;
import javafx.scene.shape.Box;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
public class FxFrame extends Jframe {
public FxFrame(){
this.setBounds(50,50,320,240);
this.setTitle("FXフレーム");
JFXPanel fxPanel = new JFXPanel();
Scene scene = createScene();
fxPanel.setScene(scene);
this.add(fxPanel);
this.setVisible(true);
}
private static Scene 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 );
Scene scene = new Scene(group, Color.AQUA);
scene.setCamera( camera );
return (scene);
}
}
FXフレームを閉じたのち再表示できない不具合対策
親フレームから子のFxフレームを呼び出し、これを閉じたあとに再び表示させようとすると開けないことに気づきました。
この場合、Mainの中に下記1文を入れると不具合を解消できます。
Platform.setImplicitExit(false);
最終更新日: 2019-02-06 08:16:04