2016-08-29 3 views
0
package org.gillius.jfxutils.examples; 

import javafx.animation.Animation; 
import javafx.animation.KeyFrame; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.chart.LineChart; 
import javafx.scene.chart.XYChart; 
import javafx.scene.control.Label; 
import javafx.scene.control.Slider; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Region; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.util.Duration; 
import org.gillius.jfxutils.JFXUtil; 
import org.gillius.jfxutils.chart.ChartPanManager; 
import org.gillius.jfxutils.chart.FixedFormatTickFormatter; 
import org.gillius.jfxutils.chart.JFXChartUtil; 
import org.gillius.jfxutils.chart.StableTicksAxis; 

import java.text.SimpleDateFormat; 
import java.util.TimeZone; 

public class Test extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @FXML 
    private LineChart<Number, Number> chart; 

    @FXML 
    private Slider valueSlider; 

    @FXML 
    private Label outputLabel; 

    private XYChart.Series<Number, Number> series; 

    private long startTime; 

    private Timeline addDataTimeline; 

    @FXML 
    void addSample() { 
     series.getData().add(new XYChart.Data(1, 23)); 
series.getData().add(new XYChart.Data(2, 14)); 
     series.getData().add(new XYChart.Data(3, 15)); 
     series.getData().add(new XYChart.Data(4, 24)); 
     series.getData().add(new XYChart.Data(5, 34)); 
     series.getData().add(new XYChart.Data(6, 36)); 
     series.getData().add(new XYChart.Data(7, 22)); 
     series.getData().add(new XYChart.Data(8, 45)); 
     series.getData().add(new XYChart.Data(9, 43)); 
     series.getData().add(new XYChart.Data(10, 17)); 
     series.getData().add(new XYChart.Data(11, 29)); 
     series.getData().add(new XYChart.Data(12, 25)); 
    } 
@FXML 
    void autoZoom() { 
     chart.getXAxis().setAutoRanging(true); 
     chart.getYAxis().setAutoRanging(true); 
    } 

    @FXML 
    void toggleAdd() { 
     switch (addDataTimeline.getStatus()) { 
      case PAUSED: 
      case STOPPED: 
       addDataTimeline.play(); 
       chart.getXAxis().setAutoRanging(true); 
       chart.getYAxis().setAutoRanging(true); 
       //Animation looks horrible if we're updating a lot 
       chart.setAnimated(false); 
       chart.getXAxis().setAnimated(false); 
       chart.getYAxis().setAnimated(false); 
       break; 
      case RUNNING: 
addDataTimeline.stop(); 
       //Return the animation since we're not updating a lot 
       chart.setAnimated(true); 
       chart.getXAxis().setAnimated(true); 
       chart.getYAxis().setAnimated(true); 
       break; 

      default: 
       throw new AssertionError("Unknown status"); 
     } 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("Charting.fxml")); 
     Region contentRootRegion = (Region) loader.load(); 

     StackPane root = JFXUtil.createScalePane(contentRootRegion, 960, 540, false); 
     Scene scene = new Scene(root, root.getPrefWidth(), root.getPrefHeight()); 
     stage.setScene(scene); 
     stage.setTitle("Charting Example"); 
     stage.show(); 
} 

@FXML 
    void initialize() { 
     startTime = System.currentTimeMillis(); 

     //Set chart to format dates on the X axis 
//  SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); 
//  format.setTimeZone(TimeZone.getTimeZone("GMT")); 
//  ((StableTicksAxis) chart.getXAxis()).setAxisTickFormatter(
//    new FixedFormatTickFormatter(format)); 

     series = new XYChart.Series<Number, Number>(); 
     series.setName("Data"); 

     chart.getData().add(series); 

     addDataTimeline = new Timeline(new KeyFrame(
       Duration.millis(250), 
       new EventHandler<ActionEvent>() { 
        @Override 
        public void handle(ActionEvent actionEvent) { 
         addSample(); 
        } 
       } 
     )); 
     addDataTimeline.setCycleCount(Animation.INDEFINITE); 

     chart.setOnMouseMoved(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       double xStart = chart.getXAxis().getLocalToParentTransform().getTx(); 
       double axisXRelativeMousePosition = mouseEvent.getX() - xStart; 

      } 
     }); 

//Panning works via either secondary (right) mouse or primary with ctrl held down 
     ChartPanManager panner = new ChartPanManager(chart); 
     panner.setMouseFilter(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       if (mouseEvent.getButton() == MouseButton.SECONDARY || 
         (mouseEvent.getButton() == MouseButton.PRIMARY && 
          mouseEvent.isShortcutDown())) { 
        //let it through 
       } else { 
        mouseEvent.consume(); 
       } 
      } 
     }); 
     panner.start(); 

     //Zooming works only via primary mouse button without ctrl held down 
     JFXChartUtil.setupZooming(chart, new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       if (mouseEvent.getButton() != MouseButton.PRIMARY || 
        mouseEvent.isShortcutDown()) 
        mouseEvent.consume(); 
      } 
     }); 

     JFXChartUtil.addDoublePrimaryClickAutoRangeHandler(chart); 
    } 
} 

이것은 꺾은 선형 차트를 나타내는 코드입니다. 그것은 Xaxis에 문자열을 삽입하려고 시도 할 때까지 잘 작동합니다. 이 차트는 Xaxis의 문자열과 함께 사용하고 싶습니다. 나는이 오류가 발생했습니다 : javafx.scene.chart.CategoryAxis이 문제는 당신이 LineChart<Number, Number>로 정의 된 차트를 가지고있다 javafx.scene.chart.ValueAxisXaxis에 꺾은 선형 차트로 날짜를 표시하는 중 오류가 발생했습니다.

답변

0

으로 캐스팅 할 수 없습니다.

String X-값과 Number Y-값이 같은 일반 매개 변수를 설정해야와 차트하게하려면 : 대부분의 아마 당신이 사용하고자하는 다음

LineChart<String, Number> chart; 

CategoryAxis :

A axis implementation that will works on string categories where each value as a unique category(tick mark) along the axis.

참고 : 차트가 FXML 파일에서 가져 오므로 FXML 파일도 업데이트해야합니다.

:

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

는 그런 다음으로이 시리즈에 데이터를 추가 할 수 있습니다 :

CategoryAxis xAxis = new CategoryAxis(); 
NumberAxis yAxis = new NumberAxis();  

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

는 또한, 당신은 또한 시리즈의 선언과 초기화를 업데이트해야

series.getData().add(new XYChart.Data("SomeString", 23)); 

Creating Categories for a Line Chart section (example 3-4) 원본 튜토리얼.

는 업데이트 :

그것은 JFXUtils package usedValueAxis의 경우 zomming 지원하지 않는 것을 발견. 가능한 해결책은 this answer과 같이 가로 막 대형 차트의 확대/축소를 만드는 것입니다.

+0

맞습니다.하지만 거기에서 수정하면 오류가 지속됩니다. 아이디어는 스크롤 및 확대/축소를위한 마우스 휠에 대한 일부 이벤트가 있고 문제가 있다고 생각합니다. 예를 들어 문자열로 수정하면 다음과 같은 오류가 발생합니다. ChartPanManager panner = new ChartPanManager (chart); – CobianuA

+0

이 줄에서 오류가 발생하면, 전체 org.gillius.jfxutils 패키지로 그 클래스에 대한 코드를 게시하도록 요청할 수있는 일은 지금 우리를위한 블랙 박스입니다. – DVarga

+0

String을 사용하는 변경으로 인해 x 축이 ChartZoomManager를 깨뜨리는 경우 ... – CobianuA

관련 문제