不兼容的类型:javafx.scene.media.Media 无法转换为 javax.print.attribute.standard.Media

Incompatible Types: javafx.scene.media.Media cannot be converted to javax.print.attribute.standard.Media

全部,

我正在使用 Amazon Corretto 11 库和 OpenJFX 构建媒体播放器。我有这个问题让我一直在挣扎。 Java 还是个新手,如果有人能帮我解决这个问题,我将不胜感激。

Error while compiling:
D:\Java Masterclass\Media_Player\src\main\controller.java:30:59
java: incompatible types: javafx.scene.media.Media cannot be converted to javax.print.attribute.standard.Media
Main.java file:

package main;

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

import java.io.IOException;

public class main extends Application {

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

    @Override
    public void start(Stage primaryStage) throws IOException {
        controller.primaryStage = primaryStage;
        Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
        primaryStage.setTitle("Media Player");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}
Main.fxml file:

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

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

<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.controller">
   <top>
      <MenuBar BorderPane.alignment="CENTER">
        <menus>
          <Menu mnemonicParsing="false" text="Video">
            <items>
              <MenuItem mnemonicParsing="false" onAction="#loadVideo" text="Load" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </top>
   <left>
      <ListView fx:id="videoList" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </left>
   <bottom>
      <Button mnemonicParsing="false" onMouseClicked="#toggleVideoPlay" prefHeight="26.0" prefWidth="95.0" text="Play / Pause" BorderPane.alignment="CENTER" />
   </bottom>
   <center>
      <MediaView fx:id="player" fitHeight="400.0" fitWidth="600.0" BorderPane.alignment="CENTER" />
   </center>
</BorderPane>
videoItem.java file:

package customViews;

import javafx.scene.control.Label;

import javax.print.attribute.standard.Media;

public class videoItem extends Label {

    private Media video;

    public videoItem(String videoPath, Media video){
        this.video = video;
        super.setText("Video name: "+ getVideoName(videoPath));
    }

    private String getVideoName(String videoPath) {
        String[] pathParts = videoPath.split("/");
        return pathParts[pathParts.length - 1];
    }

    public Media getVideo() {
        return video;
    }
}
Controller.java file:

package main;

import customViews.videoItem;
import javafx.event.ActionEvent;
import javafx.scene.control.ListView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class controller {
    static Stage primaryStage;
    public MediaView player;
    public ListView<videoItem> videoList;

    public void loadVideo(ActionEvent actionEvent) {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Open Video File");
        String videoPath = fileChooser.showOpenDialog(primaryStage).toURI().toString();
        Media video = new Media(videoPath);
        playVideo(video);

        addToLibrary(videoPath, video);
    }

    private void addToLibrary(String videoPath, Media video) {
        videoList.getItems().add(new videoItem(videoPath, **video**));
    }

    private void playVideo(Media video) {
        MediaPlayer mediaPlayer = new MediaPlayer(video);
        mediaPlayer.setAutoPlay(false);
        player.setMediaPlayer(mediaPlayer);
    }

    public void toggleVideoPlay(MouseEvent mouseEvent) {
        if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){
            if (player.getMediaPlayer().getStatus().equals(MediaPlayer.Status.PLAYING)){
                player.getMediaPlayer().pause();
            } else {
                player.getMediaPlayer().play();
            }
        }
    }
}

在controller.java文件中,传递的视频参数返回到javafx.scene.media.Media,但目的是从javax.print.attribute.standard.Media中指定videoItem.java。已导入 javax.print.attribute.standard.Media 但没有用,因为两者的媒体命名约定相同。

我正在尝试建立一个打开的视频列表,如下所示:

MediaPlayer SceneBuilder Screenshot

非常感谢任何可以帮助我的人。

干杯

我猜是新手错误。 videoItem 文件永远不应包含 javax.print.attribute.standard.Media,而应包含 javafx.scene.media.Media.