Advertisement
Guest User

Untitled

a guest
Jul 25th, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. import javafx.application.Application;
  2. import javafx.event.EventHandler;
  3. import javafx.geometry.Point2D;
  4. import javafx.scene.Group;
  5. import javafx.scene.Scene;
  6. import javafx.scene.canvas.Canvas;
  7. import javafx.scene.canvas.GraphicsContext;
  8. import javafx.scene.input.MouseEvent;
  9. import javafx.stage.Stage;
  10. import static javafx.scene.input.MouseEvent.*;
  11.  
  12. import rx.Observable;
  13. import rx.Subscriber;
  14. import rx.functions.Func1;
  15. import rx.subscriptions.Subscriptions;
  16.  
  17. public class Paint extends Application {
  18.  
  19. @Override
  20. public void start(Stage stage) throws Exception {
  21.  
  22. Integer screenWidth = 800;
  23. Integer screenHeight = 600;
  24.  
  25. Canvas canvas = new Canvas(screenHeight, screenWidth);
  26. GraphicsContext gc = canvas.getGraphicsContext2D();
  27. Group root = new Group();
  28. root.getChildren().add(canvas);
  29.  
  30. Observable<Boolean> leftButtonUp = leftButtonUp(canvas);
  31. Observable<Boolean> leftButtonDown = leftButtonDown(canvas);
  32.  
  33. leftButtonUp.subscribe(up -> System.out.println("up: "+up));
  34. leftButtonDown.subscribe(down -> System.out.println("down: "+down));
  35.  
  36.  
  37. Observable<MouseEvent> mouseMoves = mouseMoves(canvas);
  38. Observable<MouseEvent> mouseDrags = mouseDrags(canvas);
  39.  
  40. Observable<MouseEvent> mouse = Observable.merge(mouseMoves, mouseDrags);
  41.  
  42. Observable<Point2D[]> mouseDiffs =
  43. mouse
  44. .buffer(2, 1)
  45. .map(buffer -> new Point2D[]{
  46. new Point2D(buffer.get(0).getX(), buffer.get(0).getY()),
  47. new Point2D(buffer.get(1).getX(), buffer.get(1).getY())
  48. });
  49.  
  50. Observable<Point2D[]> paint =
  51. mouseDiffs
  52. .window(leftButtonDown, (Boolean b) -> leftButtonUp)
  53. .flatMap(x -> x);
  54.  
  55. paint.subscribe(diff -> {
  56. gc.strokeLine(diff[0].getX(), diff[0].getY(),diff[1].getX(), diff[1].getY());
  57. });
  58.  
  59. stage.setTitle("Rx Paint");
  60. stage.setScene(new Scene(root));
  61. stage.show();
  62. }
  63.  
  64. Observable<Boolean> leftButtonDown(Canvas canvas) {
  65. return Observable.create((Subscriber<? super Boolean> subscriber) -> {
  66. EventHandler<MouseEvent> handler = mouseEvent -> subscriber.onNext(true);
  67. canvas.addEventHandler(MOUSE_PRESSED, handler);
  68. subscriber.add(Subscriptions.create(() -> canvas.removeEventHandler(MOUSE_PRESSED, handler)));
  69. });
  70. }
  71.  
  72. Observable<Boolean> leftButtonUp(Canvas canvas) {
  73. return Observable.create((Subscriber<? super Boolean> subscriber) -> {
  74. EventHandler<MouseEvent> handler = mouseEvent -> subscriber.onNext(false);
  75. canvas.addEventHandler(MOUSE_RELEASED, handler);
  76. subscriber.add(Subscriptions.create(() -> canvas.removeEventHandler(MOUSE_RELEASED, handler)));
  77. });
  78. }
  79.  
  80. Observable<MouseEvent> mouseMoves(Canvas canvas) {
  81. return Observable.create((Subscriber<? super MouseEvent> subscriber) -> {
  82. EventHandler<MouseEvent> handler = subscriber::onNext;
  83. canvas.addEventHandler(MOUSE_MOVED, handler);
  84. subscriber.add(Subscriptions.create(() -> canvas.removeEventHandler(MOUSE_MOVED, handler)));
  85. });
  86. }
  87.  
  88. Observable<MouseEvent> mouseDrags(Canvas canvas) {
  89. return Observable.create((Subscriber<? super MouseEvent> subscriber) -> {
  90. EventHandler<MouseEvent> handler = subscriber::onNext;
  91. canvas.addEventHandler(MOUSE_DRAGGED, handler);
  92. subscriber.add(Subscriptions.create(() -> canvas.removeEventHandler(MOUSE_DRAGGED, handler)));
  93. });
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement