2012-10-29 9 views
6

下のコードはXYLineChartをプロットしています。マウスの左ボタンをクリックしてドラッグすると、プロットされた行を左右に平行移動できます。JavaFX 2.x:Line、Grid、X Ticksを一緒に動かすには?

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

私の質問は、ラインを移動することで

1)今すぐに残っている/右、グリッドとXダニが動かない:そう、どのように一緒にライン、グリッドとXダニを変換しますか?

2)これはJavaFx 2で可能ですか?

おかげ

編集助けて喜ん誰?

編集2: import文は編集3

を追加しました:コードの改善を、今、グリッドラインが一緒に移動します。 X軸のティックをラインとグリッドと共に移動するだけで、垂直グリッドラインはライン範囲の値外にありません

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

何か助けを借りてください!

+0

具体的に何を達成しようとしていますか?これをコンパイルすると(次回はインポートを含めてください。Eclipse/Netbeansはスマートですがスマートではありません)、それを実行してください。プロットされた点で*印がついたグラフが表示されます。意味あり。グラフを翻訳する(すべての点の値を変更する)か、グラフを移動しようとしていますか?あなたは間違いなくそのままそれを動かしています。 –

+0

こんにちはダニエル:このコードは、グリッドと目盛りが静止している間、ダニ値を変更します。 さらに、X軸の範囲は1から10までのint値なので、左または右に折れ線グラフを移動しているときは小数点以下を使うべきではない –

+0

私はそれを実行するとティックは静的になりますが、あなたが見ているもの(正しい挙動)。 2つ目は、ティックの価値が気になる場合は、値全体で設定する必要があります。今はマウスイベント(double)を使用しています。これはダブルに設定しています。あなたは(1)のセットでそれを「スナップ」するために何らかの計算をする必要がありますが、それはあまりにも難しくありません。あなたがもっと深く見る必要があるティックを使ってチャートをスクロールすることに興味があれば、それは「オフザシェルフ」の解決策ではないようです。 –

答えて

0

これはむしろコメントですが、なんとか新しいコメントをしています。

私は、目に見えないスクロールバーでスクロールペインにチャートを埋め込み、チャートのy軸不透明度を0に設定することでこれにアプローチします。すべてのチャートデータをメモリに読み込むことができない場合は、スクロールイベントなどでデータフェッチを管理する必要があります。

さらに、y軸にスタンドアロンNumberAxisを使用できます。あなたは手でスケーリングと位置決めを行う必要があります。

関連する問題