Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package sample;
- import javafx.animation.AnimationTimer;
- import javafx.application.Application;
- import javafx.event.ActionEvent;
- import javafx.event.EventHandler;
- import javafx.geometry.Insets;
- import javafx.geometry.Pos;
- import javafx.scene.Scene;
- import javafx.scene.chart.LineChart;
- import javafx.scene.chart.NumberAxis;
- import javafx.scene.chart.XYChart;
- import javafx.scene.control.Button;
- import javafx.scene.control.Slider;
- import javafx.scene.layout.StackPane;
- import javafx.scene.text.Font;
- import javafx.stage.Stage;
- import java.awt.*;
- import java.util.Date;
- import java.util.concurrent.ConcurrentLinkedQueue;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.ThreadFactory;
- //короче, надо сдвигать по тому как увеличивается время. то есть сдвиг +t
- public class Main extends Application {
- private Date dateStart;
- public static Date currD; //текущая дата
- public static long currT; //текущее время
- public static long dT_1; //первая граница дТ
- public static long dT_2; //
- public double w; //омега
- public double w_forA; //омега для амплитудной модуляции
- public double A; //амплитуда
- public static final Slider slider1 = new Slider(0.0, 20.0, 10.0);
- public static final Slider slider2 = new Slider(0.0, 20.0, 10.0);
- public static Button refresh;
- public static boolean updStage = false;
- public static int MAX_DATA_POINTS = 500;
- private int xSeriesData = 0;
- private XYChart.Series<Number, Number> series1 = new XYChart.Series<>();
- private XYChart.Series<Number, Number> series2 = new XYChart.Series<>();
- private ExecutorService executor;
- // private ConcurrentLinkedQueue<Number> dataQ1 = new ConcurrentLinkedQueue<>();
- private NumberAxis xAxis;
- private void init(Stage primaryStage) {
- Rectangle rec = new Rectangle(0, 0);
- xAxis = new NumberAxis(0, MAX_DATA_POINTS, 100);
- xAxis.setForceZeroInRange(false);
- xAxis.setAutoRanging(false);
- xAxis.setTickLabelsVisible(true); //
- xAxis.setTickMarkVisible(true);
- xAxis.setMinorTickVisible(true);
- xAxis.setLabel("t (секунды)");
- NumberAxis yAxis = new NumberAxis();
- final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
- lineChart.setAnimated(false);
- lineChart.setTitle("АМПЛИТУДНАЯ МОДУЛЯЦИЯ");
- lineChart.setHorizontalGridLinesVisible(true);
- lineChart.setCreateSymbols(false);
- series1.setName("Series 1");
- // Add Chart Series
- lineChart.getData().addAll(series1);
- lineChart.setMaxSize(800, 200);
- StackPane.setAlignment(lineChart, Pos.CENTER);
- final LineChart<Number, Number> lineChart2 = new LineChart<Number, Number>(xAxis, yAxis);
- lineChart2.setAnimated(false);
- lineChart2.setTitle("ЧАСТОТНАЯ МОДУЛЯЦИЯ");
- lineChart2.setHorizontalGridLinesVisible(true);
- lineChart2.setCreateSymbols(false);
- series2.setName("Series 2");
- // Add Chart Series
- lineChart2.getData().addAll(series2);
- lineChart2.setMaxSize(800, 200);
- StackPane.setAlignment(lineChart2, Pos.BOTTOM_CENTER);
- javafx.scene.control.Label am_label = new javafx.scene.control.Label("АМПЛИТУДНАЯ МОДУЛЯЦИЯ");
- am_label.setFont(Font.font("Thymes New Roman", 16));
- StackPane.setAlignment(am_label, Pos.TOP_LEFT);
- StackPane.setMargin(am_label, new Insets(40, 0, 0, 80));
- javafx.scene.control.Label am_label2 = new javafx.scene.control.Label("ЧАСТОТНАЯ МОДУЛЯЦИЯ");
- am_label2.setFont(Font.font("Thymes New Roman", 16));
- StackPane.setAlignment(am_label2, Pos.TOP_RIGHT);
- StackPane.setMargin(am_label2, new Insets(40, 85, 0, 0));
- //Slider slider1 = new Slider(0.0,20.0,10.0);
- slider1.setShowTickMarks(true);
- slider1.setShowTickLabels(true);
- //slider1.setBlockIncrement(2.0);
- slider1.setMajorTickUnit(5.0);
- slider1.setMinorTickCount(4);
- slider1.setSnapToTicks(true); //округление
- slider1.setMinSize(300, 64);
- slider1.setMaxSize(300, 64);
- StackPane.setAlignment(slider1, Pos.TOP_LEFT);
- StackPane.setMargin(slider1, new Insets(70, 0, 0, 40));
- //Slider slider2 = new Slider(0.0, 20.0, 10.0);
- slider2.setShowTickMarks(true);
- slider2.setShowTickLabels(true);
- //slider1.setBlockIncrement(2.0);
- slider2.setMajorTickUnit(5.0);
- slider2.setMinorTickCount(4);
- slider2.setSnapToTicks(true); //округление
- slider2.setMinSize(300, 64);
- slider2.setMaxSize(300, 64);
- StackPane.setAlignment(slider2, Pos.TOP_RIGHT);
- StackPane.setMargin(slider2, new Insets(70, 40, 0, 0));
- refresh = new Button("Обновить");
- refresh.setFont(Font.font("Thymes New Roman", 14));
- StackPane.setAlignment(refresh, Pos.TOP_CENTER);
- StackPane.setMargin(refresh, new Insets(150, 0, 0, 0));
- refresh.setOnAction(new EventHandler<ActionEvent>() {
- @Override
- public void handle(ActionEvent event) {
- updStage = true;
- }
- });
- StackPane root = new StackPane(lineChart, lineChart2, slider1, slider2, am_label, am_label2, refresh);
- Scene scene = new Scene(root, 1000, 700);
- primaryStage.setMinHeight(700);
- primaryStage.setMinWidth(700);
- primaryStage.setScene(scene);
- }
- @Override
- public void start(Stage stage) {
- stage.setTitle("Animated Line Chart Sample");
- init(stage);
- stage.show();
- w_forA = Main.slider1.getValue();
- executor = Executors.newCachedThreadPool(new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- Thread thread = new Thread(r);
- thread.setDaemon(true);
- return thread;
- }
- });
- dateStart = new Date();
- AddToQueue addToQueue = new AddToQueue();
- executor.execute(addToQueue);
- //-- Prepare Timeline
- prepareTimeline();
- }
- private class AddToQueue implements Runnable {
- public void run() {
- try {
- if (updStage){
- executor.shutdown();
- updStage = false;
- //executor.execute();
- }
- dT_1 = currT;
- currD = new Date();
- currT = (currD.getTime() - dateStart.getTime());
- //нужно округлить время
- currT = (currT / 50);
- w = Main.slider2.getValue();
- A = Main.slider1.getValue();
- //dataQ1.add(Math.cos(currT * w));
- Thread.sleep(20);
- executor.execute(this);
- } catch (InterruptedException ex) {
- ex.printStackTrace();
- }
- }
- }
- //-- Timeline gets called in the JavaFX Main thread
- private void prepareTimeline() {
- // Every frame to take any data from queue and add to chart
- new AnimationTimer() {
- @Override
- public void handle(long now) {
- //addDataToSeriesMe();
- addDataToSeriesMe2(); //!!!!!!!!!!!!!!!!!!!!!!!!!
- }
- }.start();
- }
- private void addDataToSeriesMe2() {
- for (int i = 0; i < 10; i++) {
- series1.getData().add(new XYChart.Data<>(currT, A*Math.cos(currT * w_forA))); //амплитудная
- series2.getData().add(new XYChart.Data<>(currT, Math.cos(currT * w))); //частотная
- }
- // remove points to keep us at no more than MAX_DATA_POINTS
- if ((series1.getData().size() > 9000)) {
- dT_1 = (currT - dT_1)/20;
- xAxis.setLowerBound(xAxis.getLowerBound() + 0.5); //+087
- xAxis.setUpperBound(xAxis.getUpperBound() + 0.5); //+087
- }
- }
- void restart(Stage stage) {
- //cleanup();
- start(stage);
- }
- public static void main(String[] args) {
- launch(args);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement