如何在Java fx中用YouTube的链接制作媒体视图?

问题描述 投票:0回答:1

我想在场景生成器中使用一个媒体视图,如果我点击一个按钮,它应该播放我之前给它的YouTube链接的视频。我如何去做这个?

我不希望当我点击时打开浏览器,我希望在媒体查看器领域播放视频。

java javafx error-handling builder
1个回答
0
投票

这里是一个相当最小的例子,让你开始使用Web视图控件。它需要一个YouTube的URL,并将其转换为一个嵌入式的。预览图片

我提供了两个例子,一个是完整的单类,另一个是使用场景构建器。

例1:完整的单类

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main extends Application {
    public class YTPlayer extends VBox{
        private Button plyButton;
        private WebView webView4 = new WebView();
        private HBox hBox;
        private TextArea textArea;
        private String url = "";
        private final Pattern pattern = Pattern.compile("(?<=watch\\?v=|/videos/|embed\\/|youtu.be\\/|\\/v\\/|\\/e\\/|watch\\?v%3D|watch\\?feature=player_embedded&v=|%2Fvideos%2F|embed%\u200C\u200B2F|youtu.be%2F|%2Fv%2F)[^#\\&\\?\\n]*");
        public YTPlayer(double width, double height){
            super();
            this.setPrefHeight(height);
            this.setPrefWidth(width);

            hBox = new HBox();
            hBox.setPrefHeight(0.045*height);
            hBox.setPrefWidth(width);
            textArea = new TextArea();
            textArea.setPrefHeight(0.175*height);
            textArea.setPrefWidth(0.913*width);
            textArea.setPromptText("URL");

            plyButton = new Button();
            plyButton.setPrefHeight(0.095*height);
            plyButton.setPrefWidth(0.0867*width);
            plyButton.setText("Play");
            plyButton.setOnMouseClicked(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent mouseEvent) {
                    if(!textArea.getText().equals("")){
                        setUrl(textArea.getText());
                        play();
                    }
                }
            });
            hBox.getChildren().addAll(plyButton,textArea);
            webView4.setPrefHeight(0.9025*height);
            webView4.setPrefWidth(width);
            this.getChildren().addAll(webView4,hBox);
        }
        void play (){
            webView4.getEngine().load(this.url);
        }
        void setUrl(String url){
            Matcher matcher = pattern.matcher(url);
            if(matcher.find()){
            this.url ="https://www.youtube.com/embed/"+matcher.group(0);
            System.out.println(this.url);
            }else{
                System.out.println("Invalid Url!");
            }
        }
    }
    @Override
    public void start(Stage primaryStage) throws Exception{
        double sceneWidth = 600;
        double sceneHeight =400;
        YTPlayer player =new YTPlayer(sceneWidth,sceneHeight);
        Pane root = new Pane();
        root.getChildren().addAll(player);
        Scene myscene =new Scene(root, sceneWidth,sceneHeight);
        primaryStage.setScene(myscene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

示例2:使用场景生成器

FXML文件(sample.fxml)。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.web.*?>

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
    <children>
        <WebView fx:id="webView" prefHeight="361.0" prefWidth="600.0" />
        <HBox prefHeight="18.0" prefWidth="600.0">
            <children>
                <Button mnemonicParsing="false" onAction="#play" prefHeight="38.0" prefWidth="52.0" text="Play" />
                <TextArea fx:id="urlTxtArea" prefHeight="7.0" prefWidth="548.0" promptText="URL" />
            </children>
        </HBox>
    </children>
</VBox>

Controller类(Controller.java)。

import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import javafx.scene.web.WebView;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Controller {
    private final Pattern pattern = Pattern.compile("(?<=watch\\?v=|/videos/|embed\\/|youtu.be\\/|\\/v\\/|\\/e\\/|watch\\?v%3D|watch\\?feature=player_embedded&v=|%2Fvideos%2F|embed%\u200C\u200B2F|youtu.be%2F|%2Fv%2F)[^#\\&\\?\\n]*");
    private String url;

    @FXML
    private WebView webView;

    @FXML
    private TextArea urlTxtArea;

    @FXML
    void play() {
        if(!urlTxtArea.getText().equals("")){
           Matcher matcher = pattern.matcher(this.urlTxtArea.getText());
            if(matcher.find()){
                this.url ="https://www.youtube.com/embed/"+matcher.group(0);
                webView.getEngine().load(this.url);
                System.out.println(this.url);
            }else{
                System.out.println("Invalid Url!");
            }
        }
    }
}

主类(Main.java):

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Simple Youtube video Player");
        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.