Je développe une application de bureau JavaFX. Je veux y afficher des objets 3D Java.Comment intégrer un Canvas3D dans une application JavaFX?
La façon de faire cela, autant que je sache, est d'utiliser le SwingNode de JavaFX. Java 3d doit également être intégré dans un composant Swing. C'est donc un processus en deux étapes.
Intégration de Java 3D des objets avec Java Swing
Exemple complet et minimal composé du panneau, je l'intention de réutiliser dans l'application FX et un JFrame qui montre cela fonctionne:
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;
}
}
Intégration le BallPanel dans l'application JavaFX
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);
}
}
Tout ce que je vois est un fond gris où la sphère devrait être. J'ai essayé quelques variations différentes sans aucune chance. Impossible de trouver quoi que ce soit en ligne sur cette intégration particulière entre les classes Java 3D et JavaFX.
Je sais que JavaFX a des graphiques 3D mais je ne les aime pas du tout.
connexes, sans solution, question:
How Can I embed java3d's Canvas3d in javafx layout?
Je ne connais pas Java-3D. Le 'Canvas3D' est-il un composant léger (c'est-à-dire rendu par Swing, et non par le toolkit de fenêtrage natif)? Sinon, vous ne pourrez pas le rendre dans un 'SwingNode'. Notez également que vous devez créer le contenu du 'SwingNode' sur le thread de distribution d'événement AWT via' SwingUtilities.invokeLater (...) ': voir les documents [' SwingNode'] (http://docs.oracle.com/javase /8/javafx/api/javafx/embed/swing/SwingNode.html). –
Ah, ça pourrait être ça. Apparemment, Canvas3D est un élément d'interface graphique lourd. Une solution de contournement? – DPM
Je ne pense pas. 'SwingNode' est conçu pour une rétrocompatibilité avec les composants" pure swing "(c'est-à-dire les composants légers), mais JavaFX en général a été conçu à partir de zéro. Vous devez probablement utiliser JavaFX 3D si vous utilisez JavaFX. Si vous voulez aller sur la route de JavaFX, José Pereda (qui poste ici parfois) est probablement la personne à chercher pour de bons articles JavaFX 3d. –