当前位置: 首页 > 知识库问答 >
问题:

获取文件资源的静态方式

通正平
2023-03-14

更新:我想让媒体播放器是静态的,但是如果我设置为静态的,它就不工作了。请注意,我想要mediaPlayer static的原因是我想从其他类访问它。(台词评论。)这是我的代码:

import javafx.application.Application;
import javafx.html" target="_blank">beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.text.Font;
import javafx.stage.Stage;

import java.net.URL;

public class Main extends Application {
    static boolean isSoundOn = false;
    static double soundVolume = .5;
    MediaPlayer mediaPlayer = new MediaPlayer(new Media(Main.class.getResource("song.mp3").toString()));

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

@Override
public void start(Stage primaryStage) {
    mediaPlayer.play();
    primaryStage.setTitle("duet by what");

//        primaryStage.setFullScreen(true);


    //Group gamePaused = new Group();
    //Scene _gamePaused = new Scene(gamePaused, 1200, 700);
    //Group gameOver = new Group();
    //Scene _gameOver = new Scene(gameOver, 1200, 700);
    //Group game = new Group();
    //Scene _game = new Scene(game, 1200, 700);

    GUI gui = new GUI();
    primaryStage.setScene(gui.getMainMenu().getScene());
    primaryStage.show();
}
}

class GUI {
    private MainMenu mainMenu = new MainMenu();



 public class MainMenu {
        private Scene scene;

        private MainMenu() {
            VBox vBox = new VBox();
            scene = new Scene(vBox, 400, 500);
            scene.getStylesheets().add("stylesheet.css");

            Label info = new Label(
                    "welcome the the what version\n" +
                            "of the well known Duet game!\n\n" +
                            "press \"I wanna play!\" to begin the game.\n\n" +
                            "please note that you can change\n" +
                            "the sound settings.");
            info.setId("info");
            vBox.getChildren().add(info);

            Button startGame = new Button("i wanna play right now!");
            startGame.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    System.out.println("game started!");
                }
            });
            vBox.getChildren().add(startGame);

            Label highScore = new Label("__highScore should be added here__");
            highScore.setId("highScore");
            vBox.getChildren().add(highScore);

            Button quitGame = new Button("get me out of this game!");
            quitGame.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    System.out.println("game quitted!");
                }
            });
            vBox.getChildren().add(quitGame);

            CheckBox soundOn = new CheckBox("soundOn?");
            Tooltip tooltip = new Tooltip("if this box is checked, music will be played!");
            tooltip.setFont(new Font("Arial", 16));
            soundOn.setTooltip(tooltip);
            soundOn.selectedProperty().addListener(new ChangeListener<Boolean>() {
                public void changed(ObservableValue<? extends Boolean> ov,
                                    Boolean old_val, Boolean new_val) {
                    Main.isSoundOn = soundOn.isSelected();
                    System.out.println(Main.isSoundOn);
                }
            });
            vBox.getChildren().add(soundOn);

            HBox changeVolumeWrapper = new HBox();
            changeVolumeWrapper.setId("hBox");
            Label sliderLabel = new Label("sound volume: ");
            changeVolumeWrapper.getChildren().add(sliderLabel);

            Slider soundVolume = new Slider(0, 1, .5);
            soundVolume.valueProperty().addListener(new ChangeListener<Number>() {
                public void changed(ObservableValue<? extends Number> ov,
                                    Number old_val, Number new_val) {
                    Main.soundVolume = new_val.doubleValue();
                    //Main.mediaPlayer.setVolume(Main.soundVolume);  here is why i need media player static.
                    System.out.printf("%.2f\n", Main.soundVolume);
                }
            });
            changeVolumeWrapper.getChildren().add(soundVolume);
            vBox.getChildren().add(changeVolumeWrapper);
        }

        public Scene getScene() {
            return scene;
        }
    }

    public MainMenu getMainMenu() {
        return mainMenu;
    }
}

我的代码的任何其他修复将不胜感激。顺便说一下,这些是我得到的错误:

线程“Thread-0”中出现异常Java . lang . illegalstateexception:Toolkit未在com . sun . Java FX . application . platform impl . run later(platform impl . Java:273)在com . sun . Java FX . application . platform impl . run later(platform impl . Java:268)在Java FX . scene . media . media $ _ metadata listener . on metadata(media . Java:541(Main.java:22)...3更

共有1个答案

皮安顺
2023-03-14

在没有上下文对象的情况下调用getclass()与任何其他实例方法的解释相同:this.getclass()

在静态上下文中,您可以使用 ClassName.class 引用该类;即你可以做

static URL resource = Main.class.getResource("a.mp3");

然而,在这种情况下,不清楚为什么您希望这些变量是静态的;每个JVM实例只能创建一个< code>Application子类的实例,这些是该实例的固有属性。

在你的(更新的)问题中的具体例子中,我将定义一个单独的类来封装< code>MediaPlayer和你当前设置为静态的其他属性。请注意,< code>MediaPlayer本身定义了一个< code >音量属性和一个< code >静音属性。所以你可以做:

public class SoundPlayer {

    private final MediaPlayer mediaPlayer ;

    public SoundPlayer(URL url) {
        this.mediaPlayer = new MediaPlayer(new Media(url));
    }

    public void play() {
        mediaPlayer.play();
    }

    public double getVolume() {
        return mediaPlayer.getVolume();
    }

    public void setVolume(double volume) {
        mediaPlayer.setVolume(volume);
    }

    public boolean isSoundOn() {
        return ! mediaPlayer.isMuted();
    }

    public void setSoundOn(boolean soundOn) {
        mediaPlayer.setMuted(! soundOn);
    }
}

现在,您的< code>Main类可以是:

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        SoundPlayer soundPlayer = new SoundPlayer(getClass().getResource("song.mp3"));
        soundPlayer.play();


        primaryStage.setTitle("duet by Aran Mohyeddin");

        GUI gui = new GUI(soundPlayer);

        primaryStage.setScene(gui.getMainMenu().getScene());
        primaryStage.show();
    }

}

并更新您的GUIMain Menu类以引用SoundPlayer

public class MainMenu {
        private Scene scene;

        private final SoundPlayer soundPlayer ;

        private MainMenu(SoundPlayer soundPlayer) {

            this.soundPlayer = soundPlayer ;

            // existing code omitted...

            CheckBox soundOn = new CheckBox("soundOn?");
            Tooltip tooltip = new Tooltip("if this box is checked, music will be played!");
            tooltip.setFont(new Font("Arial", 16));
            soundOn.setTooltip(tooltip);
            soundOn.selectedProperty().addListener(new ChangeListener<Boolean>() {
                public void changed(ObservableValue<? extends Boolean> ov,
                                    Boolean old_val, Boolean new_val) {

                    soundPlayer.setSoundOn(new_val);
                }
            });

            // ...


            Slider soundVolume = new Slider(0, 1, .5);
            soundVolume.valueProperty().addListener(new ChangeListener<Number>() {
                public void changed(ObservableValue<? extends Number> ov,
                                    Number old_val, Number new_val) {

                    soundPlayer.setVolumn(new_val.doubleValue());
                    System.out.printf("%.2f\n", Main.soundVolume);
                }
            });
            changeVolumeWrapper.getChildren().add(soundVolume);
            vBox.getChildren().add(changeVolumeWrapper);
        }

        public Scene getScene() {
            return scene;
        }
    }

    public MainMenu getMainMenu() {
        return mainMenu;
    }
}

另请注意,如果从 SoundPlayer 公开实际属性对象,例如:

public class SoundPlayer {

    private final MediaPlayer mediaPlayer ;

    // ...


    public DoubleProperty volumeProperty() {
        return mediaPlayer.volumeProperty();
    }

    // ...
}

然后您可以简化一些代码

    Slider soundVolume = new Slider(0, 1, .5);
    // instead of the listener, just do:
    soundPlayer.volumeProperty().bindBidirectional(soundVolume.valueProperty());

(将mutedProperty转换为soundOnProperty稍微不那么优雅。)

 类似资料:
  • 我知道网上有很多这样的问题(特别是这里),但没有什么能真正帮助我解决问题。我正在使用spring mvc(spring version 3.1.0 Release)并且我想通过URL访问我的静态数据。 我的包: -src --main ---resources ----public 在public内部,我有一个test.xml文件。 这是我的web.xml 这是我的ServletContext.x

  • 每个网站都需要静态资源:图片、样式表、网站图标(favicon)等。在这种情况下,您可以在项目的根目录下创建一个名为 static 的目录。 放入 该目录中的每个文件都将被复制到 生成的 build 文件夹中,并保留目录的层级结构。例如,如果您将名为 sun.jpg 的文件添加到 static 文件夹中,则该文件将被复制到 build/sun.jpg 路径。 这意味着: 对于 baseUrl: '

  • 启动jar时,控制台会说找不到文件,也没有加载字体。我怎样才能解决这个问题? 我得到了这个密码:

  • 本文向大家介绍Android中获取资源 id 及资源 id 的动态获取,包括了Android中获取资源 id 及资源 id 的动态获取的使用技巧和注意事项,需要的朋友参考一下  Android中获取资源 id 及资源 id 的动态获取 我们平时获取资源是通过 findViewById 方法进行的,比如我们常在onCreate方法中使用这样的语句: findViewById是我们获取layout中各

  • 问题内容: 我想先从文件中读取字符串,然后再执行小部件上的任何其他操作,那么如何在没有活动对象调用的情况下做到这一点呢? 问题答案: 例如,创建的子类 在中设置标签的属性以指向你的新类,例如 在你的应用实例的方法中,将你的上下文(例如this)保存到一个名为的静态字段中,并创建一个返回此字段的静态方法,例如: 这是它的外观: 现在,你可以使用:每当你想要获取上下文时,然后使用(或)。

  • 本文向大家介绍SpringMVC访问静态资源的方法,包括了SpringMVC访问静态资源的方法的使用技巧和注意事项,需要的朋友参考一下 在SpringMVC中常用的就是Controller与View。但是我们常常会需要访问静态资源,如html,js,css,image等。 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问。该肿么办呢? 在配置文件: