2016-03-20 7 views
0

So habe ich ein Javafx Liniendiagramm in meinem Programm. Das Programm erzeugt jede Sekunde einen Zufallswert von 1 bis 6 und zeichnet es in der Grafik auf. Die X-Achse repräsentiert also die Zeit in Sekunden und die Y-Achse den gewählten Zufallswert. Wie würde ich das Diagramm auf der x-Achse verschieben, wenn die Zeit vergeht? das Animieren des Graphen, der in die richtige Richtung geht.JavaFX bewegt sich entlang der Achse eines Liniendiagramms

public class MainDisplayController implements Initializable { 
LineChart<String,Number> lineChart; 

Timer timer = new Timer(); 
TimerTask task; 
Random dice = new Random(); 

@Override 
public void initialize(URL arg0, ResourceBundle arg1) { 


    XYChart.Series<String,Number> series = new XYChart.Series<String,Number>(); 



    series.getData().add(new XYChart.Data<String,Number>("1",0)); 

    lineChart.getData().add(series); 

    task = new TimerTask(){ 
     int secondsPassed = 0; 
     @Override 
     public void run() { 
      secondsPassed++; 
      System.out.println(secondsPassed); 
      int number; 
      number = 1+dice.nextInt(6); 
      series.getData().add(new XYChart.Data<String,Number>(String.valueOf(secondsPassed),number)); 
     } 

    }; 

    timer.scheduleAtFixedRate(task, 1000, 1000); 
} 

} 

Antwort

0

Ich denke, Sie sollten versuchen, Einstellung:

xAxis.setForceZeroInRange(false); 

Und dann Daten entfernen 0 (ersten) indizierten aus Ihrer Serie, wenn bestimmte Bedingung erfüllt ist.

Hier ist ein Code, der etwas ähnliches tut, ich hoffe es hilft.

public class PointEverySecondLineChart extends Application { 
     private BorderPane root = new BorderPane(); 
     private Scene scene = new Scene(root,800,600); 

     private Random rand = new Random(); 

     private SimpleIntegerProperty 
       lastX = new SimpleIntegerProperty(0); 
     private XYChart.Series <Integer,Integer> mySeries; 
     private NumberAxis 
       xAxis = new NumberAxis(), 
       yAxis = new NumberAxis(); 
     private LineChart lineChart = new LineChart<>(xAxis,yAxis);  

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

     @Override 
     public void start(Stage primaryStage) { 
      Timeline addPointEverySecond = new Timeline(new KeyFrame(Duration.millis(500),event->{ 
       lastX.set(lastX.add(1).get()); 
       mySeries.getData().add(new XYChart.Data<>(lastX.get(), rand.nextInt(100))); 
       if (mySeries.getData().size()>10) mySeries.getData().remove(0); 
      })); 
      addPointEverySecond.setCycleCount(Timeline.INDEFINITE); 
      ObservableList <XYChart.Series<Integer,Integer>> data = FXCollections.observableArrayList(); 

      LineChart<Integer,Integer> chart = makeLineChart(data); 
      chart.setPrefWidth(600); 
      chart.setPrefHeight(600); 
      root.setCenter(chart); 

      Button btGo = new Button("GO!"); 
      btGo.setOnAction(action -> { 
       mySeries = new XYChart.Series<>(); 
       data.add(mySeries); 
       lastX.set(0); 
       addPointEverySecond.playFromStart(); 
      }); 

      btGo.disableProperty().bind(addPointEverySecond.statusProperty().isEqualTo(Animation.Status.RUNNING)); 
      root.setBottom(btGo);   

      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } 

     LineChart<Integer, Integer> makeLineChart(ObservableList <XYChart.Series<Integer,Integer>> series) { 
      xAxis.setForceZeroInRange(false); 
      lineChart.setCreateSymbols(false); 
      lineChart.setData(series); 
      return lineChart; 
     } 

    } 
+0

Thanks a lot das ist genau das, was ich brauche: Ich habe versucht, Ihre Lösung in mein Programm zur Nachrüstung D –

+0

So aber wenn ich versuche, es gibt mir diesen Fehler zu laufen, beschwert, dass sie einen String will und nicht ein Integer: Ausnahme im Thread "JavaFX Application Thread" java.lang.ClassCastException: java.lang.Integer kann nicht in java.lang.String –

+0

umgewandelt werden Ich habe versucht, die X-Achse zu einer CategoryAxis zu ändern, aber es tut nicht t habe die Methode setForceZeroInRange(), so kann ich das Diagramm nicht verschieben –