Le titre semble un peu confus, mais je vais tout expliquer.JPanel.getGraphics équivalent en JavaFx à utiliser avec OpenCV
Je développe un projet où je montre l'image capturée par une webcam dans un JPanel, Java Swing. Maintenant, je dois intégrer cela avec JavaFx. J'ai un contrôleur où j'ai la méthode startRecording, qui initialise le cameraThread et indique à la classe Camera de démarrerRecording, à l'intérieur Camera class a une méthode DrawFrame (BufferedImage, panneau JPanel) où j'appelle la fonction drawImage d'OpenCV pour dessiner le panneau:
Controller:
public void startRecording(){
cameraInstance.setCameraRGBPanel(windowsInstance.getCameraRGBPanel());
cameraInstance.setCameraHSVPanel(windowsInstance.getCameraHSVPanel());
cameraInstance.setCameraThresholdPanel(windowsInstance.getCameraThresholdPanel());
cameraInstance.setRecord(true);
cameraThread = new Thread(cameraInstance);
cameraThread.start();
}
caméra classe:
private void drawFrame(BufferedImage buff, JPanel pane){
pane.getGraphics().drawImage(buff, 0, 0, null);
}
pour commencer, JavaFX n'a pas JPanel et le volet (en option) n'a pas getGraphics, je l'ai essayé de utiliser un Sw ingNode, ajoutez le JPanel et faites tout comme d'habitude, mais l'image ne sera tout simplement pas affichée.
Le code suivant était un test, c'est pourquoi il semble être si "mauvais".
public void start(Stage stage) throws Exception {
stage.setTitle("Tela Teste");
pCamera = new Pane();
SwingNode swing = new SwingNode();
pCamera.getChildren().add(swing);
createAndSetSeingContent(swing);
Group root = new Group();
root.getChildren().add(pCamera);
stage.setScene(new Scene(root , 500, 500));
stage.setResizable(true);
stage.show();
}
private void createAndSetSeingContent(SwingNode swing) {
ControllerCamera control = new ControllerCamera();
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
JPanel panel = new JPanel();
JLabel label = new JLabel("Abc");
//panel.add(label);
swing.setContent(panel);
Button teste = new Button("A");
pCamera.getChildren().add(teste);
teste.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
control.startRecording(panel);
System.out.println("abc");
}
});
}
j'ai changé la méthode StartRecording à quelque chose comme:
public void startRecording(JPanel panel){
cameraInstance.setCameraRGBPanel(panel);
cameraInstance.setRecord(true);
cameraThread = new Thread(cameraInstance);
cameraThread.start();
}
Toujours rien apparaît dans le panneau, mais si j'ajouter une étiquette ou un bouton, il apparaît et fonctionne comme prévu à. Le "abc" est toujours affiché dans la console.
Je pense que c'est tout le code lié au problème. Autre chose que je veux dire, hier, c'était le premier jour où je traitais avec FX, disons que le projet est divisé, l'autre travaille aussi sur le problème, mais nous n'avons rien obtenu jusqu'ici, c'est pourquoi j'ai décidé de vous demander ici.
Édition 1: tout fonctionnait parfaitement avant toute cette situation (tout fonctionne avec Swing, mais pas en FX).
Vous pouvez afficher une image dans JavaFX en utilisant ['ImageView'] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/image/ImageView.html) et en appelant' setImage (...) '. Vous devrez soit générer 'javafx.scene.image.Image' directement, soit convertir un' java.awt.iamge.BufferedImage' à une image JavaFX en utilisant ['SwingFXUtils.toFXImage'] (http://docs.oracle.com/javase/8/javafx/api/javafx/embed/swing/SwingFXUtils.html#toFXImage-java.awt.image .BufferedImage-javafx.scene.image.WritableImage-) –
Essayer maintenant. –
cela a fonctionné. Je suis désolé c'était si simple, j'étais juste désespéré de résoudre un problème dans un environnement que je ne connais pas. S'il vous plaît, postez est comme une réponse afin que je puisse marquer comme la réponse finale. Je vous remercie! –