Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.47 KB | None | 0 0
  1. package sample;
  2.  
  3. import javafx.animation.AnimationTimer;
  4. import javafx.application.Application;
  5. import javafx.event.ActionEvent;
  6. import javafx.event.EventHandler;
  7. import javafx.geometry.Insets;
  8. import javafx.geometry.Pos;
  9. import javafx.scene.Scene;
  10. import javafx.scene.chart.LineChart;
  11. import javafx.scene.chart.NumberAxis;
  12. import javafx.scene.chart.XYChart;
  13. import javafx.scene.control.Button;
  14. import javafx.scene.control.Slider;
  15. import javafx.scene.layout.StackPane;
  16. import javafx.scene.text.Font;
  17. import javafx.stage.Stage;
  18.  
  19. import java.awt.*;
  20. import java.util.Date;
  21. import java.util.concurrent.ConcurrentLinkedQueue;
  22. import java.util.concurrent.ExecutorService;
  23. import java.util.concurrent.Executors;
  24. import java.util.concurrent.ThreadFactory;
  25.  
  26. //короче, надо сдвигать по тому как увеличивается время. то есть сдвиг +t
  27.  
  28. public class Main extends Application {
  29. private Date dateStart;
  30. public static Date currD; //текущая дата
  31. public static long currT; //текущее время
  32. public static long dT_1; //первая граница дТ
  33. public static long dT_2; //
  34. public double w; //омега
  35. public double w_forA; //омега для амплитудной модуляции
  36. public double A; //амплитуда
  37. public static final Slider slider1 = new Slider(0.0, 20.0, 10.0);
  38. public static final Slider slider2 = new Slider(0.0, 20.0, 10.0);
  39. public static Button refresh;
  40. public static boolean updStage = false;
  41.  
  42.  
  43. public static int MAX_DATA_POINTS = 500;
  44. private int xSeriesData = 0;
  45. private XYChart.Series<Number, Number> series1 = new XYChart.Series<>();
  46. private XYChart.Series<Number, Number> series2 = new XYChart.Series<>();
  47.  
  48. private ExecutorService executor;
  49. // private ConcurrentLinkedQueue<Number> dataQ1 = new ConcurrentLinkedQueue<>();
  50.  
  51. private NumberAxis xAxis;
  52.  
  53. private void init(Stage primaryStage) {
  54. Rectangle rec = new Rectangle(0, 0);
  55.  
  56.  
  57. xAxis = new NumberAxis(0, MAX_DATA_POINTS, 100);
  58. xAxis.setForceZeroInRange(false);
  59. xAxis.setAutoRanging(false);
  60. xAxis.setTickLabelsVisible(true); //
  61. xAxis.setTickMarkVisible(true);
  62. xAxis.setMinorTickVisible(true);
  63. xAxis.setLabel("t (секунды)");
  64.  
  65. NumberAxis yAxis = new NumberAxis();
  66.  
  67. final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
  68. lineChart.setAnimated(false);
  69. lineChart.setTitle("АМПЛИТУДНАЯ МОДУЛЯЦИЯ");
  70. lineChart.setHorizontalGridLinesVisible(true);
  71. lineChart.setCreateSymbols(false);
  72. series1.setName("Series 1");
  73. // Add Chart Series
  74. lineChart.getData().addAll(series1);
  75. lineChart.setMaxSize(800, 200);
  76. StackPane.setAlignment(lineChart, Pos.CENTER);
  77.  
  78.  
  79. final LineChart<Number, Number> lineChart2 = new LineChart<Number, Number>(xAxis, yAxis);
  80. lineChart2.setAnimated(false);
  81. lineChart2.setTitle("ЧАСТОТНАЯ МОДУЛЯЦИЯ");
  82. lineChart2.setHorizontalGridLinesVisible(true);
  83. lineChart2.setCreateSymbols(false);
  84. series2.setName("Series 2");
  85. // Add Chart Series
  86. lineChart2.getData().addAll(series2);
  87. lineChart2.setMaxSize(800, 200);
  88. StackPane.setAlignment(lineChart2, Pos.BOTTOM_CENTER);
  89.  
  90.  
  91. javafx.scene.control.Label am_label = new javafx.scene.control.Label("АМПЛИТУДНАЯ МОДУЛЯЦИЯ");
  92. am_label.setFont(Font.font("Thymes New Roman", 16));
  93. StackPane.setAlignment(am_label, Pos.TOP_LEFT);
  94. StackPane.setMargin(am_label, new Insets(40, 0, 0, 80));
  95.  
  96. javafx.scene.control.Label am_label2 = new javafx.scene.control.Label("ЧАСТОТНАЯ МОДУЛЯЦИЯ");
  97. am_label2.setFont(Font.font("Thymes New Roman", 16));
  98. StackPane.setAlignment(am_label2, Pos.TOP_RIGHT);
  99. StackPane.setMargin(am_label2, new Insets(40, 85, 0, 0));
  100.  
  101.  
  102. //Slider slider1 = new Slider(0.0,20.0,10.0);
  103. slider1.setShowTickMarks(true);
  104. slider1.setShowTickLabels(true);
  105. //slider1.setBlockIncrement(2.0);
  106. slider1.setMajorTickUnit(5.0);
  107. slider1.setMinorTickCount(4);
  108. slider1.setSnapToTicks(true); //округление
  109. slider1.setMinSize(300, 64);
  110. slider1.setMaxSize(300, 64);
  111. StackPane.setAlignment(slider1, Pos.TOP_LEFT);
  112. StackPane.setMargin(slider1, new Insets(70, 0, 0, 40));
  113.  
  114. //Slider slider2 = new Slider(0.0, 20.0, 10.0);
  115. slider2.setShowTickMarks(true);
  116. slider2.setShowTickLabels(true);
  117. //slider1.setBlockIncrement(2.0);
  118. slider2.setMajorTickUnit(5.0);
  119. slider2.setMinorTickCount(4);
  120. slider2.setSnapToTicks(true); //округление
  121. slider2.setMinSize(300, 64);
  122. slider2.setMaxSize(300, 64);
  123. StackPane.setAlignment(slider2, Pos.TOP_RIGHT);
  124. StackPane.setMargin(slider2, new Insets(70, 40, 0, 0));
  125.  
  126. refresh = new Button("Обновить");
  127. refresh.setFont(Font.font("Thymes New Roman", 14));
  128. StackPane.setAlignment(refresh, Pos.TOP_CENTER);
  129. StackPane.setMargin(refresh, new Insets(150, 0, 0, 0));
  130. refresh.setOnAction(new EventHandler<ActionEvent>() {
  131. @Override
  132. public void handle(ActionEvent event) {
  133. updStage = true;
  134. }
  135. });
  136.  
  137. StackPane root = new StackPane(lineChart, lineChart2, slider1, slider2, am_label, am_label2, refresh);
  138. Scene scene = new Scene(root, 1000, 700);
  139. primaryStage.setMinHeight(700);
  140. primaryStage.setMinWidth(700);
  141. primaryStage.setScene(scene);
  142. }
  143.  
  144.  
  145. @Override
  146. public void start(Stage stage) {
  147. stage.setTitle("Animated Line Chart Sample");
  148. init(stage);
  149. stage.show();
  150. w_forA = Main.slider1.getValue();
  151.  
  152. executor = Executors.newCachedThreadPool(new ThreadFactory() {
  153. @Override
  154. public Thread newThread(Runnable r) {
  155.  
  156. Thread thread = new Thread(r);
  157. thread.setDaemon(true);
  158. return thread;
  159. }
  160. });
  161.  
  162.  
  163. dateStart = new Date();
  164.  
  165. AddToQueue addToQueue = new AddToQueue();
  166.  
  167. executor.execute(addToQueue);
  168. //-- Prepare Timeline
  169. prepareTimeline();
  170. }
  171.  
  172. private class AddToQueue implements Runnable {
  173. public void run() {
  174. try {
  175. if (updStage){
  176. executor.shutdown();
  177. updStage = false;
  178. //executor.execute();
  179. }
  180. dT_1 = currT;
  181.  
  182. currD = new Date();
  183. currT = (currD.getTime() - dateStart.getTime());
  184. //нужно округлить время
  185. currT = (currT / 50);
  186.  
  187. w = Main.slider2.getValue();
  188. A = Main.slider1.getValue();
  189. //dataQ1.add(Math.cos(currT * w));
  190.  
  191.  
  192. Thread.sleep(20);
  193. executor.execute(this);
  194.  
  195.  
  196. } catch (InterruptedException ex) {
  197. ex.printStackTrace();
  198. }
  199. }
  200. }
  201.  
  202. //-- Timeline gets called in the JavaFX Main thread
  203. private void prepareTimeline() {
  204. // Every frame to take any data from queue and add to chart
  205. new AnimationTimer() {
  206. @Override
  207. public void handle(long now) {
  208. //addDataToSeriesMe();
  209. addDataToSeriesMe2(); //!!!!!!!!!!!!!!!!!!!!!!!!!
  210. }
  211. }.start();
  212. }
  213.  
  214.  
  215. private void addDataToSeriesMe2() {
  216. for (int i = 0; i < 10; i++) {
  217. series1.getData().add(new XYChart.Data<>(currT, A*Math.cos(currT * w_forA))); //амплитудная
  218. series2.getData().add(new XYChart.Data<>(currT, Math.cos(currT * w))); //частотная
  219. }
  220. // remove points to keep us at no more than MAX_DATA_POINTS
  221. if ((series1.getData().size() > 9000)) {
  222. dT_1 = (currT - dT_1)/20;
  223. xAxis.setLowerBound(xAxis.getLowerBound() + 0.5); //+087
  224. xAxis.setUpperBound(xAxis.getUpperBound() + 0.5); //+087
  225. }
  226.  
  227. }
  228.  
  229. void restart(Stage stage) {
  230. //cleanup();
  231. start(stage);
  232. }
  233.  
  234. public static void main(String[] args) {
  235. launch(args);
  236. }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement