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에 꺾은 선형 차트로 날짜를 표시하는 중 오류가 발생했습니다.
맞습니다.하지만 거기에서 수정하면 오류가 지속됩니다. 아이디어는 스크롤 및 확대/축소를위한 마우스 휠에 대한 일부 이벤트가 있고 문제가 있다고 생각합니다. 예를 들어 문자열로 수정하면 다음과 같은 오류가 발생합니다. ChartPanManager panner = new ChartPanManager (chart); – CobianuA
이 줄에서 오류가 발생하면, 전체 org.gillius.jfxutils 패키지로 그 클래스에 대한 코드를 게시하도록 요청할 수있는 일은 지금 우리를위한 블랙 박스입니다. – DVarga
String을 사용하는 변경으로 인해 x 축이 ChartZoomManager를 깨뜨리는 경우 ... – CobianuA