2012-10-29 3 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

무엇을 구체적으로 수행하려고합니까? 컴파일 할 때 다음 번에 가져 오기를 포함 시키십시오. 이클립스/넷빈은 똑똑하지만 그리 똑똑하지 않습니다.) 그리고 그래프를 실행 해보면 눈금이 표시된 채로 움직이는 것을 볼 수 있습니다. 이것은 의미가 있습니다. 그래프를 변환 (모든 포인트 값 변경)하거나 그래프 이동을 원하십니까? 당신은 확실히 그것을 움직이고 있습니다. –

+0

안녕하세요 다니엘 :이 코드는 틱 및 눈금이 계속 표시되는 동안 틱 값을 변경합니다. X 축의 범위가 1에서 10까지이므로 X 축은 왼쪽/오른쪽으로 꺾은 선형 차트로 이동하는 동안 십진수가 없어야합니다. –

+0

두 가지 : 실행하면 진드기가 정적이지만 변경 번호가 반영됩니다. 당신이보고있는 것 (올바른 행동). 둘째, 틱의 가치에 관심이 있다면 전체 값을 통해 설정해야합니다. 지금 당신은 double로 설정 한 마우스 이벤트 (double)를 사용하고 있습니다. (1)의 세트를 통해 "스냅"하기 위해 계산을해야하지만 너무 어렵지 않아야합니다. 진드기가있는 차트를 스크롤하는 데 관심이 있다면 더 깊이보아야 할 것입니다. 이는 "선반에서 벗어난"해결책으로 보이지 않습니다. –

답변

0

이것은 다소 논평이지만 다소 새로운 의견을 말합니다.

차트에 보이지 않는 스크롤 막대가있는 ScrollPane을 포함시키고 차트의 y 축 불투명도를 0으로 설정하면됩니다. 모든 차트 데이터를 메모리에로드 할 수 없다면 스크롤 이벤트 등에서 데이터 가져 오기를 관리해야합니다.

또한 y 축에 독립형 NumberAxis를 사용할 수 있습니다. 손으로 프로퍼어 스케일 및 위치 지정을 수행해야합니다.