在使用 Javafx 播放视频时,我怎样才能让一个“rect”(处理库)出现在它的前面?

While using Javafx for playing a video, how can i make a “rect”(Processing lib), for example, appear in front of it?

我的视频播放得很好,但我需要在它前面显示一些元素。

我在 Eclipse 中使用 'PApplet'(一项大学作业要求我们使用 Processing IDE,但我需要一些 Java 函数来使其按照我设想的方式工作) 并且每次视频开始播放时(通过 javafx)它都会占据整个程序屏幕。

即使我调用了一个矩形,例如,我调用视频开始后,它仍然占据了整个屏幕,我看不到这个矩形。

public class UsingProcessing extends PApplet {

   String Dir = System.getProperty("C:\Users\Matheus\eclipse-workspace\Narraint");
   Stage stage;

   ZonedDateTime now = ZonedDateTime.now();
   LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
   java.time.Duration d = java.time.Duration.between(startOfDay,now);
   javafx.util.Duration duration = new javafx.util.Duration( d.toMillis());


   public static void main(String[] args) {

      PApplet.main("UsingProcessing");
   }

   public void settings() {

      size(1100, 618,FX2D);
   }

   public void setup() {

      try {

          Field field = PSurfaceFX.class.getDeclaredField("stage");
          field.setAccessible(true);
          stage = (Stage)field.get(surface);

          File f = new File(Dir, "narrativas.mp4");

          Media media = new Media(f.toURI().toURL().toString());
          javafx.scene.media.MediaPlayer player = new javafx.scene.media.MediaPlayer(media);
          MediaView viewer = new MediaView(player);

          DoubleProperty width = viewer.fitWidthProperty();
          DoubleProperty height = viewer.fitHeightProperty();
          width.bind(Bindings.selectDouble(viewer.sceneProperty(), "width"));
          height.bind(Bindings.selectDouble(viewer.sceneProperty(), "height"));
          viewer.setPreserveRatio(true);

          StackPane root = new StackPane();
          root.getChildren().add(viewer);

          Scene scenes = new Scene(root, 1100, 618, Color.TRANSPARENT);
          stage.setScene(scenes);
          stage.setTitle("OBSV.CamFeed.6°07'08.3\"S 12°23'51.5\"E");
          stage.setFullScreen(false);
          stage.show();
          player.setStartTime(duration); 
          player.setCycleCount(MediaPlayer.INDEFINITE);
          player.play();
      } 

      catch(Exception e) {

          e.printStackTrace();
      }
   }

   public void draw() {

      rect(30, 20, 80, 50); //Just for testing, if anything can show up in
                           //front of the video then my problem is solved!
   }
}

您看不到矩形的原因是您正在用包含视频的场景替换处理场景(用于渲染 'rect')。

通过访问处理产生的 canvas(您可以使用 stage 变量获得),您可以使用 StackPane 将 canvas 放在视频前面:

public void settings() {
    size(300, 300, FX2D);
}

...

StackPane root = new StackPane();
root.getChildren().add(viewer);
Node processingCanvas = stage.getScene().getRoot().getChildrenUnmodifiable().get(0);
root.getChildren().add(processingCanvas);
Scene scenes = new Scene(root, 1100, 618, Color.TRANSPARENT);
stage.setScene(scenes);

更新

按要求完成示例:

import java.io.File;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
import processing.core.PApplet;
import processing.javafx.PSurfaceFX;

public class UsingProcessing extends PApplet {

    private static final String VIDEO_FILE_NAME = "teste.mp4";
    private static final String DIRECTORY = "/home/vladwoguer/Downloads/";
    Stage stage;

    ZonedDateTime now = ZonedDateTime.now();
    LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
    javafx.util.Duration duration = Duration.ZERO;

    public static void main(String[] args) {

        PApplet.main("UsingProcessing");
    }

    public void settings() {
        size(300, 300, FX2D);
    }

    public void setup() {

        try {

            Field field = PSurfaceFX.class.getDeclaredField("stage");
            field.setAccessible(true);
            stage = (Stage) field.get(surface);

            File f = new File(DIRECTORY, VIDEO_FILE_NAME);

            Media media = new Media(f.toURI().toURL().toString());
            javafx.scene.media.MediaPlayer player = new javafx.scene.media.MediaPlayer(media);
            MediaView viewer = new MediaView(player);

            DoubleProperty width = viewer.fitWidthProperty();
            DoubleProperty height = viewer.fitHeightProperty();
            width.bind(Bindings.selectDouble(viewer.sceneProperty(), "width"));
            height.bind(Bindings.selectDouble(viewer.sceneProperty(), "height"));
            viewer.setPreserveRatio(true);

            StackPane root = new StackPane();
            root.getChildren().add(viewer);
            Node processingCanvas = stage.getScene().getRoot().getChildrenUnmodifiable().get(0);

            root.getChildren().add(processingCanvas);
            Scene scenes = new Scene(root, 1100, 618, Color.TRANSPARENT);
            stage.setScene(scenes);
            stage.setTitle("OBSV.CamFeed.6°07'08.3\"S 12°23'51.5\"E");
            stage.setFullScreen(false);
            stage.show();
            player.setStartTime(duration);
            player.setCycleCount(MediaPlayer.INDEFINITE);
            player.play();

        }

        catch (Exception e) {

            e.printStackTrace();
        }
    }

    public void draw() {
        rect(30, 20, 80, 50); // Just for testing, if anything can show up in
    }
}

* 更新 * 透明背景

使用:

public void draw() {

    PImage img;
    img = loadImage(DIRECTORY + "background_1.png");
    background(img);

    rect(50, 50, 150, 150); // Just for testing, if anything can show up in
}

background_1.png 必须是与 Scene.

大小相同的透明 png 图片

结果:

完整代码:

import java.io.File;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
import processing.core.PApplet;
import processing.core.PImage;
import processing.javafx.PSurfaceFX;

public class UsingProcessing extends PApplet {

    private static final String VIDEO_FILE_NAME = "teste.mp4";
    private static final String DIRECTORY = "/home/vladwoguer/Downloads/";
    Stage stage;

    ZonedDateTime now = ZonedDateTime.now();
    LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
    javafx.util.Duration duration = Duration.ZERO;

    public static void main(String[] args) {

        PApplet.main("UsingProcessing");
    }

    public void settings() {
        size(300, 300, FX2D);
    }

    public void setup() {

        try {

            Field field = PSurfaceFX.class.getDeclaredField("stage");
            field.setAccessible(true);
            stage = (Stage) field.get(surface);

            File f = new File(DIRECTORY, VIDEO_FILE_NAME);

            Media media = new Media(f.toURI().toURL().toString());
            javafx.scene.media.MediaPlayer player = new javafx.scene.media.MediaPlayer(media);
            MediaView viewer = new MediaView(player);

            DoubleProperty width = viewer.fitWidthProperty();
            DoubleProperty height = viewer.fitHeightProperty();
            width.bind(Bindings.selectDouble(viewer.sceneProperty(), "width"));
            height.bind(Bindings.selectDouble(viewer.sceneProperty(), "height"));
            viewer.setPreserveRatio(true);

            StackPane root = new StackPane();
            root.getChildren().add(viewer);
            Node processingCanvas = stage.getScene().getRoot().getChildrenUnmodifiable().get(0);

            root.getChildren().add(processingCanvas);
            Scene scenes = new Scene(root, 300, 300, Color.TRANSPARENT);
            stage.setScene(scenes);
            stage.setTitle("OBSV.CamFeed.6°07'08.3\"S 12°23'51.5\"E");
            stage.setFullScreen(false);
            stage.show();
            player.setStartTime(duration);
            player.setCycleCount(MediaPlayer.INDEFINITE);
            player.play();

        }

        catch (Exception e) {

            e.printStackTrace();
        }
    }

    public void draw() {
        PImage img;
        img = loadImage(DIRECTORY + "background_1.png");
        background(img);
        rect(50, 50, 150, 150); // Just for testing, if anything can show up in
    }
}