1 Reply Latest reply: Nov 7, 2012 8:45 AM by James_D RSS

    How to edit lines drawned on XY LineChart?

    935521
      This code draw lines on a chart by left mouse click and move
      import javafx.application.Application;
      import javafx.event.EventHandler;
      import javafx.scene.Group;
      import javafx.scene.Scene;
      import javafx.scene.chart.CategoryAxis;
      import javafx.scene.chart.LineChart;
      import javafx.scene.chart.NumberAxis;
      import javafx.scene.chart.XYChart;
      import javafx.scene.control.Label;
      import javafx.scene.input.MouseEvent;
      import javafx.scene.layout.BorderPane;
      import javafx.scene.layout.Pane;
      import javafx.scene.paint.Color;
      import javafx.scene.shape.Line;
      import javafx.scene.shape.LineTo;
      import javafx.scene.shape.MoveTo;
      import javafx.scene.shape.Path;
      import javafx.stage.Stage;
      
      public class Lines extends Application {
      
      Path path;
      
      public static void main(String[] args) {
          launch(args);
      }
      
      @Override
      public void start(Stage stage) {
      
          final CategoryAxis xAxis = new CategoryAxis();
          final NumberAxis yAxis = new NumberAxis(1, 21, 0.1);
          yAxis.setTickUnit(1);
          yAxis.setPrefWidth(35);
          yAxis.setMinorTickCount(10);
          yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) {
              @Override
              public String toString(Number object) {
                  String label;
                  label = String.format("%7.2f", object.floatValue());
                  return label;
              }
          });
          final LineChart<String, Number> lineChart = new LineChart<String, Number>(xAxis, yAxis);
      
          lineChart.setCreateSymbols(false);
          lineChart.setAlternativeRowFillVisible(false);
          lineChart.setLegendVisible(false);
      
          XYChart.Series series1 = new XYChart.Series();
      
          series1.getData().add(new XYChart.Data("Jan", 1));
          series1.getData().add(new XYChart.Data("Feb", 4));
          series1.getData().add(new XYChart.Data("Mar", 2.5));
          series1.getData().add(new XYChart.Data("Apr", 5));
          series1.getData().add(new XYChart.Data("May", 6));
          series1.getData().add(new XYChart.Data("Jun", 8));
          series1.getData().add(new XYChart.Data("Jul", 12));
          series1.getData().add(new XYChart.Data("Aug", 8));
          series1.getData().add(new XYChart.Data("Sep", 11));
          series1.getData().add(new XYChart.Data("Oct", 13));
          series1.getData().add(new XYChart.Data("Nov", 10));
          series1.getData().add(new XYChart.Data("Dec", 20));
      
          BorderPane bp = new BorderPane();
          bp.setCenter(lineChart);
          Scene scene = new Scene(bp, 800, 600);
          lineChart.setAnimated(false);
          lineChart.getData().addAll(series1);
      
          Lines.MouseHandler mh = new Lines.MouseHandler( bp );
          bp.setOnMouseClicked( mh );
          bp.setOnMouseMoved( mh );
      
          stage.setScene(scene);
      
          path = new Path();
          path.setStrokeWidth(1);
          path.setStroke(Color.BLACK);
      
          scene.setOnMouseDragged(mh);
          scene.setOnMousePressed(mh);
          bp.getChildren().add(path);
          stage.setScene(scene);
          stage.show();
      }
      
      class MouseHandler implements EventHandler< MouseEvent > {
      private boolean gotFirst    = false;
      private Line    line;
      private Pane    pane;
      private double  x1, y1, x2, y2;
      
      public MouseHandler( Pane pane ) {
          this.pane = pane;
      }    
      @Override
      public void handle( MouseEvent event ) {
          if( event.getEventType() == MouseEvent.MOUSE_CLICKED ) {
              if( !gotFirst ) {
                  x1 = x2 = event.getX();
                  y1 = y2 = event.getY();
                  line = new Line( x1, y1, x2, y2 );
      
                  pane.getChildren().add( line );
      
                  gotFirst = true;
              } 
              else {
                  line = null;
                  gotFirst = false;
              }
          } 
              else {
                  if( line != null ) {
                      x2 = event.getX();
                      y2 = event.getY();
                      // update line
                      line.setEndX( x2 );
                      line.setEndY( y2 );
              }
            }
          }
        }
      }
      My question is: how to edit such lines once plotted?

      In example, once one or more line(s) are drawn I would like to select one of these, and by right mouse click and using a pop-up menu, delete it, modify length, (to make it shorter or longer) or change line slope.

      Thanks all.

      Edited by: 932518 on 7-nov-2012 2.54