我正在开发一个程序,该程序将能够使用来自麦克风或线路输入的流式幅度数据来绘制音频波形。我想这样做的方法是以等于采样率的速率从样本数据中绘制每个点,在绘制每个点时在 x 方向上移动 1 步。因此,我需要每秒更新大约 44100 次 JavaFx 应用程序线程来绘制每个点。在我开始这样做之前,我想通过画一条直线并且每半秒更新一次每个点来测试我的想法。我正在使用 Timeline 类来执行此操作。我的代码如下所示:
public class JavaFxPractice extends Application {
private int xValue = 50;
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
EventHandler<ActionEvent> eventHandler = e -> {
xValue++;
Line point = new Line(xValue,50,xValue,50);
pane.getChildren().add(point);
};
Timeline animation = new Timeline(new KeyFrame(Duration.millis((500)), eventHandler));
animation.setCycleCount(500);
animation.play();
Scene scene = new Scene(pane, 600, 500);
primaryStage.setTitle("Streaming Test");
primaryStage.setScene(scene);
primaryStage.show();
}
}
但是,每次我这样做时,我的程序都会变得无响应,我必须强制关闭它。我注意到,如果我做同样的事情,而是让 Text 闪烁,它工作得非常好。是否有原因无法使用 Timeline 类绘制线条?它会给线程带来太多负担吗?如果是这样,我可以通过什么方式解决我的想法。我只想能够实时绘制波形,以每秒 44,100 次左右的速度更新。