我正在開發一個JavaFX桌面應用程序。其中我想顯示一些Java 3D對象。如何在JavaFX應用程序中嵌入Canvas3D?
據我所知,這樣做的方法是使用JavaFX的SwingNode。 Java 3d也必須集成到Swing組件中。所以這是一個兩步過程。
集成的Java 3D使用Java Swing對象
我打算在FX應用程序重用面板和JFrame的組成完整的和最小的例子,顯示它的工作原理:
import java.awt.BorderLayout;
import javax.swing.JFrame;
public class JFrameWithCanvas3D extends JFrame {
public JFrameWithCanvas3D() {
super("Swing JFrame Wraps Canvas3D");
setLayout(new BorderLayout());
BallPanel panel = new BallPanel();
add(panel, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
System.setProperty("sun.awt.noerasebackground", "true");
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings("unused")
@Override
public void run() {
new JFrameWithCanvas3D();
}
});
}
}
public class BallPanel extends JPanel {
public BallPanel() {
setLayout(new BorderLayout());
setPreferredSize(new Dimension(500, 500));
add(makeCanvas());
}
private static Canvas3D makeCanvas() {
BranchGroup group = new BranchGroup();
group.addChild(makeLight());
group.addChild(new Sphere(5));
Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
SimpleUniverse universe = new SimpleUniverse(canvas3D);
Transform3D viewTransform = new Transform3D();
viewTransform.setTranslation(new Vector3d(0, 0, 20)); //move "back" a little
universe.getViewingPlatform().getViewPlatformTransform().setTransform(viewTransform);
universe.addBranchGraph(group);
return canvas3D;
}
private static DirectionalLight makeLight() {
DirectionalLight light = new DirectionalLight(new Color3f(Color.WHITE), new Vector3f(-1.0f, -1.0f, -1.0f));
light.setInfluencingBounds(new BoundingSphere(new Point3d(0, 0, 0), 100));
return light;
}
}
整合JavaFX應用程序中的BallPanel
public class FXAppWithSwingPanel extends Application {
@Override
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setPreferredSize(new Dimension(450, 450));
panel.add(new BallPanel(), BorderLayout.CENTER);
swingNode.setContent(panel);
Pane pane = new Pane();
pane.getChildren().add(swingNode);
stage.setScene(new Scene(pane, 500, 500));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我所看到的只是球體應該在的灰色背景。我已經嘗試了幾個不同的變化,沒有運氣。無法在網上找到關於Java 3D類和JavaFX之間特定集成的任何信息。
我知道JavaFX有3D圖形,但我不喜歡它們(完全)。
相關,沒有得到解決,問題:
How Can I embed java3d's Canvas3d in javafx layout?
我不知道Java-3D。 Canvas3D是一個輕量級組件(即由Swing呈現,而不是由本地窗口工具包呈現的組件)?如果沒有,你將無法在'SwingNode'中渲染它。另外請注意,您應該通過SwingUtilities.invokeLater(...)在AWT事件調度線程上創建'SwingNode'的內容:參見['SwingNode'文檔](http://docs.oracle.com/javase /8/javafx/api/javafx/embed/swing/SwingNode.html)。 –
啊,就是這樣。顯然Canvas3D是一個重量級的GUI元素。任何解決方法? – DPM
我不這麼認爲。 'SwingNode'設計用於與「純擺動」組件(即輕量級組件)的後兼容,但是通常JavaFX是從零開始設計的。如果您使用的是JavaFX,則可能必須使用JavaFX 3D。如果你想要去JavaFX路線,JoséPereda(有時候在這裏發帖)可能是尋找好的JavaFX 3d文章的人。 –