gpt4 book ai didi

javafx-2 - JavaFX、MediaPlayer——体积问题!为什么 mediaPlayer 的音量没有一点点变化?

转载 作者:行者123 更新时间:2023-12-02 02:04:57 29 4
gpt4 key购买 nike

我将音量设置为 0.0,然后在 while 循环中一点一点地改变音量。然而,音量从 0.0 跳到 1.0?如何顺利改变音量?我试过了

public class EngineSound extends Application {

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

@Override
public void start(Stage primaryStage) throws Exception {
mp3File = new File(metronom);
media = new Media(mp3File.toURI().toURL().toString());
mediaPlayer = new MediaPlayer(media);
mediaView = new MediaView(mediaPlayer);
mediaPlayer.play();
mediaPlayer.setVolume(0.0);
slider = new Slider();

slider.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
mediaPlayer.setVolume(slider.getValue());

}
});
}
});

double count = 1;
while (count != 101) {
for (int i = 0; i < 100000000; i++) {

}
slider.setValue(count / 100);
count++;
System.out.println(mediaPlayer.getVolume());
}
}
}

最佳答案

您的代码有一些问题。

  • JavaFX 代码应该在 JavaFX 应用程序线程上执行,而不是在 Swing 事件调度线程上执行。

不使用 EventQueue.invokeLater 在 Swing 线程上执行,而是使用 Platform.runLater在 JavaFX 线程上执行。

  • 根本没有理由使用 Swing 事件分派(dispatch)线程。

您的程序只使用 JavaFX 控件,所以不要在 Swing 线程上运行任何东西。

  • 您通常不需要在 ChangeListener 中调用任何线程切换。

即使使用 EventQueue.invokeLater 是错误的,在这种情况下您甚至不需要 Platform.runLater 因为只有 JavaFX 应用程序线程应该修改无论如何 slider 值。您可以在 JavaFX Node 中看到一条规则文档:

An application must attach nodes to a Scene, and modify nodes that are already attached to a Scene, on the JavaFX Application Thread.

  • 不要忙于等待 JavaFX 应用程序线程。

您数到一亿的循环只会阻塞应用程序线程,导致 UI 卡住,因为控制永远不会返回到框架以更新 UI。

  • 不要在循环中更改 slider 值。

在 UI 控件上设置值后,您必须将控制权返回给 JavaFX 框架,以允许值更改反射(reflect)在控件中并反射(reflect)给用户。

尝试以下代码,它通过使用 Timeline 解决了上述所有问题。和 Binding .

import javafx.animation.*;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.event.*;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.media.*;
import javafx.stage.Stage;
import javafx.util.Duration;

public class EngineSound extends Application {
private static final String MEDIA_URL =
"http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv";

private static final Duration FADE_DURATION = Duration.seconds(2.0);

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

@Override public void start(Stage stage) throws Exception {
final MediaPlayer mediaPlayer = new MediaPlayer(
new Media(
MEDIA_URL
)
);
final MediaView mediaView = new MediaView(mediaPlayer);

HBox layout = new HBox(5);
layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;");
layout.getChildren().addAll(
createVolumeControls(mediaPlayer),
mediaView
);
stage.setScene(new Scene(layout, 650, 230));
stage.show();

mediaPlayer.play();
}

public Region createVolumeControls(final MediaPlayer mediaPlayer) {
final Slider volumeSlider = new Slider(0, 1, 0);
volumeSlider.setOrientation(Orientation.VERTICAL);

mediaPlayer.volumeProperty().bindBidirectional(volumeSlider.valueProperty());

final Timeline fadeInTimeline = new Timeline(
new KeyFrame(
FADE_DURATION,
new KeyValue(mediaPlayer.volumeProperty(), 1.0)
)
);

final Timeline fadeOutTimeline = new Timeline(
new KeyFrame(
FADE_DURATION,
new KeyValue(mediaPlayer.volumeProperty(), 0.0)
)
);

Button fadeIn = new Button("Fade In");
fadeIn.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent t) {
fadeInTimeline.play();
}
});
fadeIn.setMaxWidth(Double.MAX_VALUE);

Button fadeOut = new Button("Fade Out");
fadeOut.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent t) {
fadeOutTimeline.play();
}
});
fadeOut.setMaxWidth(Double.MAX_VALUE);

VBox controls = new VBox(5);
controls.getChildren().setAll(
volumeSlider,
fadeIn,
fadeOut
);
controls.setAlignment(Pos.CENTER);
VBox.setVgrow(volumeSlider, Priority.ALWAYS);

controls.disableProperty().bind(
Bindings.or(
Bindings.equal(Timeline.Status.RUNNING, fadeInTimeline.statusProperty()),
Bindings.equal(Timeline.Status.RUNNING, fadeOutTimeline.statusProperty())
)
);

return controls;
}
}

代码控制一个视频,但让它只播放音频只是将媒体 URL 设置为仅音频格式(如 mp3 或 aac)的问题。

volumecontrolsample

关于javafx-2 - JavaFX、MediaPlayer——体积问题!为什么 mediaPlayer 的音量没有一点点变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15479821/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com