在使用 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
}
}
我的视频播放得很好,但我需要在它前面显示一些元素。
我在 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
.
结果:
完整代码:
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
}
}