2016-03-20 37 views
0

したがって、プログラムにjavafx折れ線グラフがあります。プログラムは毎秒1-6のランダム値を生成し、それをグラフにプロットします。したがって、X軸は秒単位の時間を表し、Y軸は選択されたランダム値を表します。時間が経つにつれてグラフをx軸上で動かすにはどうすればいいですか?すなわちグラフを正しい方向にアニメーション化する。JavaFXは線グラフの軸に沿って移動します

xAxis.setForceZeroInRange(false); 

を、一定の条件が満たされたときに、あなたのシリーズからのデータは0(最初の1)のインデックスを作成削除:

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); 
} 

} 

答えて

0

は、私はあなたが設定してみるべきだと思います。

似たようなコードがいくつかありますが、私はそれが役に立ちそうです。

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

このたくさんのおかげで、私が必要とする正確に何である:D –

+0

だから私は私のプログラムにあなたのソリューションを改造しようとしましたが、私は実行しようとすると、それは私にこのエラーを与え、それは文字列を望んでいることを文句はありません整数: スレッド「JavaFXアプリケーションスレッド」の例外java.lang.ClassCastException:java.lang.Integerはjava.lang.Stringにキャストできません –

+0

X軸をCategoryAxisに変更しようとしましたが、メソッドsetForceZeroInRange()があるので、移動するグラフを取得できません –

関連する問題