2012-10-29 5 views
6

Il codice seguente traccia un grafico XYLine: facendo clic con il pulsante sinistro del mouse e trascinando la linea tracciata è possibile eseguire la conversione verso sinistra/destra.JavaFX 2.x: Come spostare le zecche Linea, Griglia e X insieme?

import javafx.application.Application; 
import javafx.beans.property.SimpleDoubleProperty; 
import javafx.event.EventHandler; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.chart.LineChart; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
enter code here 


public class GridMove extends Application { 

    BorderPane pane; 
    XYChart.Series series1 = new XYChart.Series(); 
    SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectX = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectY = new SimpleDoubleProperty(); 

    @Override 
    public void start(Stage stage) { 

     final NumberAxis xAxis = new NumberAxis(1, 12, 1); 
     final NumberAxis yAxis = new NumberAxis(0.53000, 0.53910, 0.0005); 

     xAxis.setAnimated(false); 
     yAxis.setAnimated(false); 

     yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 
      @Override 
      public String toString(Number object) { 
       return String.format("%7.5f", object); 
      } 
     }); 

     final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis); 

     lineChart.setCreateSymbols(false); 
     lineChart.setAlternativeRowFillVisible(false); 
     lineChart.setAnimated(false); 
     lineChart.setLegendVisible(false); 

     series1.getData().add(new XYChart.Data(1, 0.53185)); 
     series1.getData().add(new XYChart.Data(2, 0.532235)); 
     series1.getData().add(new XYChart.Data(3, 0.53234)); 
     series1.getData().add(new XYChart.Data(4, 0.538765)); 
     series1.getData().add(new XYChart.Data(5, 0.53442)); 
     series1.getData().add(new XYChart.Data(6, 0.534658)); 
     series1.getData().add(new XYChart.Data(7, 0.53023)); 
     series1.getData().add(new XYChart.Data(8, 0.53001)); 
     series1.getData().add(new XYChart.Data(9, 0.53589)); 
     series1.getData().add(new XYChart.Data(10, 0.53476)); 

     pane = new BorderPane(); 
     pane.setCenter(lineChart); 
     Scene scene = new Scene(pane, 800, 600); 
     lineChart.getData().addAll(series1); 

     stage.setScene(scene); 

     scene.setOnMouseClicked(mouseHandler); 
     scene.setOnMouseDragged(mouseHandler); 
     scene.setOnMouseEntered(mouseHandler); 
     scene.setOnMouseExited(mouseHandler); 
     scene.setOnMouseMoved(mouseHandler); 
     scene.setOnMousePressed(mouseHandler); 
     scene.setOnMouseReleased(mouseHandler); 
     stage.show(); 
    } 
    EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent mouseEvent) { 

      if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { 
       rectinitX.set(mouseEvent.getX()); 
      } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED) { 
       LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter(); 
       NumberAxis xAxis = (NumberAxis) lineChart.getXAxis(); 

       double Tgap = xAxis.getWidth()/(xAxis.getUpperBound() - xAxis.getLowerBound()); 
       double newXlower = xAxis.getLowerBound(), newXupper = xAxis.getUpperBound(); 
       double Delta = 0.3; 

       if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
        if (rectinitX.get() < mouseEvent.getX()) { 
         newXlower = xAxis.getLowerBound() - Delta; 
         newXupper = xAxis.getUpperBound() - Delta; 
        } else if (rectinitX.get() > mouseEvent.getX()) { 
         newXlower = xAxis.getLowerBound() + Delta; 
         newXupper = xAxis.getUpperBound() + Delta; 
        } 
        xAxis.setLowerBound(newXlower); 
        xAxis.setUpperBound(newXupper); 
       } 
       rectinitX.set(mouseEvent.getX()); 
      } 
     } 
    }; 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Le mie domande sono

1) Ora, spostando la linea di sinistra/destra, Grid e X zecche non si muove: così, come tradurre Linea, Grid e X zecche insieme?

2) È possibile eseguire questo in JavaFx 2?

Grazie

Modifica Nessuno disposto ad aiutare?

Edit 2: istruzioni import aggiunto

Edit 3: miglioramenti del Codice, la società della rete e la linea si muove insieme. Resta solo per spostare l'asse X zecche insieme con la linea e griglia, e la griglia verticale mancano valori fuori gamma linea

import java.util.Set; 
import javafx.application.Application; 
import javafx.beans.property.DoubleProperty; 
import javafx.beans.property.SimpleDoubleProperty; 
import javafx.collections.ObservableList; 
import javafx.event.EventHandler; 
import javafx.scene.chart.Axis; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.scene.chart.XYChart.Series; 
import javafx.stage.Stage; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.chart.LineChart; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.shape.LineTo; 
import javafx.scene.shape.MoveTo; 
import javafx.scene.shape.Path; 

public class GridMove extends Application { 

BorderPane pane; 

XYChart.Series series1 = new XYChart.Series(); 

SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
SimpleDoubleProperty rectX = new SimpleDoubleProperty(); 
SimpleDoubleProperty rectY = new SimpleDoubleProperty(); 
LineChart<Number, Number> lineChart; 

@Override 
public void start(Stage stage) { 

    final NumberAxis xAxis = new NumberAxis(1, 12, 1); 
    final NumberAxis yAxis = new NumberAxis(0.53000, 0.53910, 0.0005); 

    xAxis.setAnimated(false); 
    yAxis.setAnimated(false); 

    yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 
     @Override 
     public String toString(Number object) { 
      return String.format("%7.5f", object); 
     } 
    }); 

    lineChart = new LineChart<Number, Number>(xAxis, yAxis); 

    lineChart.setCreateSymbols(false); 
    lineChart.setAlternativeRowFillVisible(false); 
    lineChart.setAnimated(false); 
    lineChart.setLegendVisible(false); 

    series1.getData().add(new XYChart.Data(1, 0.53185)); 
    series1.getData().add(new XYChart.Data(2, 0.532235)); 
    series1.getData().add(new XYChart.Data(3, 0.53234)); 
    series1.getData().add(new XYChart.Data(4, 0.538765)); 
    series1.getData().add(new XYChart.Data(5, 0.53442)); 
    series1.getData().add(new XYChart.Data(6, 0.534658)); 
    series1.getData().add(new XYChart.Data(7, 0.53023)); 
    series1.getData().add(new XYChart.Data(8, 0.53001)); 
    series1.getData().add(new XYChart.Data(9, 0.53589)); 
    series1.getData().add(new XYChart.Data(10, 0.53476)); 

    pane = new BorderPane(); 
    pane.setCenter(lineChart); 
    Scene scene = new Scene(pane, 800, 600); 
    lineChart.getData().addAll(series1);    

    stage.setScene(scene); 

    scene.setOnMouseClicked(mouseHandler); 
    scene.setOnMouseDragged(mouseHandler); 
    scene.setOnMouseEntered(mouseHandler); 
    scene.setOnMouseExited(mouseHandler); 
    scene.setOnMouseMoved(mouseHandler); 
    scene.setOnMousePressed(mouseHandler); 
    scene.setOnMouseReleased(mouseHandler); 
    stage.show();  
} 
EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent mouseEvent) { 

      if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { 
      rectinitX.set(mouseEvent.getX()); 
     } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED) { 
      LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter(); 
      NumberAxis xAxis = (NumberAxis) lineChart.getXAxis(); 

      double newXlower = xAxis.getLowerBound(), newXupper = xAxis.getUpperBound(); 
      double Delta = 0.3; 

      if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) { 
       if (rectinitX.get() < mouseEvent.getX()) { 
        Delta *= -1;      
       } 
       newXlower = xAxis.getLowerBound() + Delta; 
       newXupper = xAxis.getUpperBound() + Delta; 

       xAxis.setLowerBound(newXlower); 
       xAxis.setUpperBound(newXupper); 

       DoubleProperty p1 = xAxis.scaleXProperty(); 
       DoubleProperty p2 = xAxis.translateXProperty(); 

       double horizontalValueRange = xAxis.getUpperBound() - xAxis.getLowerBound(); 
       double horizontalWidthPixels = xAxis.getWidth(); 
       //pixels per unit 
       double xScale = horizontalWidthPixels/horizontalValueRange; 

       Set<Node> nodes = lineChart.lookupAll(".chart-vertical-grid-lines"); 
       for (Node n: nodes) { 
        Path p = (Path) n; 
        double currLayoutX = p.getLayoutX(); 
        p.setLayoutX(currLayoutX + (Delta*-1) * xScale); 
       }      
       double lox = xAxis.getLayoutX();          
      } 
      rectinitX.set(mouseEvent.getX()); 
     } 
    } 
}; 
public static void main(String[] args) { 
    launch(args); 
} 
} 

Qualsiasi aiuto molto apprezzato!

+0

Che cosa stai cercando in particolare? Quando li compilo (tra l'altro, includi le importazioni la prossima volta, Eclipse/Netbeans sono intelligenti, ma non così intelligenti) ed eseguilo. Vedo il grafico muoversi con i segni di graduazione * restando * con i punti tracciati. Questo ha senso. Stai cercando di tradurre il grafico (cambia tutti i valori dei punti) o stai cercando di spostare il grafico. Lo stai sicuramente spostando così com'è. –

+0

Ciao Daniel: questo codice modifica i valori di tick mentre i segni di griglia e tick sono fermi. Cosa c'è di più, poiché l'asse X varia in valori int da 1 a 10, non dovrei avere decimali mentre si sposta a sinistra/a destra il grafico delle linee –

+0

Un paio di cose: quando lo eseguo, le zecche rimangono statiche, ma cambiano il numero per riflettere cosa stai guardando (comportamento corretto). Due, se sei preoccupato del valore delle zecche, devi impostarlo tramite un valore intero. In questo momento stai usando l'evento del mouse (doppio) che lo sta impostando su un doppio. Dovresti fare un po 'di calcolo per "farla" con un set di (1) ma non dovrebbe essere troppo difficile. Se sei interessato a far scorrere il grafico con i segni di graduazione, dovrai guardare più in profondità, che non sembra essere una soluzione "pronta per l'uso". –

risposta

0

Questo è piuttosto un commento ma in qualche modo è troppo nuovo per commentare.

Mi avvicinerei a questo incorporando il grafico in un ScrollPane con barre di scorrimento invisibili e impostando l'opacità dell'asse y del grafico su 0. Se non è possibile caricare tutti i dati del grafico in memoria, è necessario gestire il recupero dei dati negli eventi di scorrimento, ecc.

Inoltre, è possibile utilizzare un NumberAxis standalone per l'asse y. Devi eseguire il ridimensionamento e il posizionamento dell'elica manualmente.