0
我將鼠標移動到線圖放大xAxis,yAxis(yAxis是NumberAxis,xAxis是categoryAxis。) 我在這裏搜索一種方法,此方法NumberAxis放大是沒有問題的,但categoryAxis zoom有問題。 如何做到這一點? 謝謝大家。JavaFx lineChart Zoom by CategoryAxis(字符串類型)
import javafx.application.Application;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Zoom extends Application {
Path path;//Add path for freehand
Rectangle rect;
SimpleDoubleProperty rectinitX = new SimpleDoubleProperty();
SimpleDoubleProperty rectinitY = new SimpleDoubleProperty();
SimpleDoubleProperty rectX = new SimpleDoubleProperty();
SimpleDoubleProperty rectY = new SimpleDoubleProperty();
LineChart lineChart2 =null;
double initXLowerBound = 0, initXUpperBound = 0, initYLowerBound = 0, initYUpperBound = 0;
@Override
public void start(Stage stage) {
stage.setTitle("Lines plot");
StackPane Mainpane = new StackPane();
Mainpane.getChildren().add(addMainpane());
Scene scene = new Scene(Mainpane, 800, 600);
stage.setScene(scene);
path = new Path();
path.setStrokeWidth(1);
path.setStroke(Color.BLACK);
stage.show();
}
private StackPane addMainpane(){
StackPane Mainpane = new StackPane();
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis(0, 13, 1);
final LineChart lineChart = new LineChart(xAxis, yAxis);
XYChart.Series series1 = new XYChart.Series();
series1.getData().add(new XYChart.Data("2013-04-01", 1));
series1.getData().add(new XYChart.Data("2013-04-02", 2));
series1.getData().add(new XYChart.Data("2013-04-03", 3));
series1.getData().add(new XYChart.Data("2013-04-04", 4));
series1.getData().add(new XYChart.Data("2013-04-05", 5));
series1.getData().add(new XYChart.Data("2013-04-06", 6));
series1.getData().add(new XYChart.Data("2013-04-07", 7));
series1.getData().add(new XYChart.Data("2013-04-08", 8));
series1.getData().add(new XYChart.Data("2013-04-09", 9));
series1.getData().add(new XYChart.Data("2013-04-10", 10));
series1.getData().add(new XYChart.Data("2013-04-11", 11));
series1.getData().add(new XYChart.Data("2013-04-12", 12));
series1.getData().add(new XYChart.Data("2013-04-13", 1));
series1.getData().add(new XYChart.Data("2013-04-14", 2));
series1.getData().add(new XYChart.Data("2013-04-15", 3));
series1.getData().add(new XYChart.Data("2013-04-16", 4));
series1.getData().add(new XYChart.Data("2013-04-17", 5));
series1.getData().add(new XYChart.Data("2013-04-18", 6));
series1.getData().add(new XYChart.Data("2013-04-19", 7));
series1.getData().add(new XYChart.Data("2013-04-20", 8));
series1.getData().add(new XYChart.Data("2013-04-21", 9));
series1.getData().add(new XYChart.Data("2013-04-22", 10));
series1.getData().add(new XYChart.Data("2013-04-23", 11));
series1.getData().add(new XYChart.Data("2013-04-24", 12));
series1.getData().add(new XYChart.Data("2013-04-25", 1));
series1.getData().add(new XYChart.Data("2013-04-26", 2));
series1.getData().add(new XYChart.Data("2013-04-27", 3));
series1.getData().add(new XYChart.Data("2013-04-28", 4));
series1.getData().add(new XYChart.Data("2013-04-29", 5));
series1.getData().add(new XYChart.Data("2013-04-30", 6));
//initXLowerBound = ((CategoryAxis) lineChart.getXAxis()).getLowerBound();
//initXUpperBound = ((CategoryAxis) lineChart.getXAxis()).getUpperBound();
initYLowerBound = ((NumberAxis) lineChart.getYAxis()).getLowerBound();
initYUpperBound = ((NumberAxis) lineChart.getYAxis()).getUpperBound();
System.out.println("initXLowerBound:"+initXLowerBound);
BorderPane pane;
pane = new BorderPane();
pane.setCenter(addpane(lineChart));
Mainpane.getChildren().add(pane);
lineChart.getData().addAll(series1);
lineChart2 = lineChart;
pane.setOnMouseClicked(mouseHandler);
pane.setOnMouseDragged(mouseHandler);
pane.setOnMouseEntered(mouseHandler);
pane.setOnMouseExited(mouseHandler);
pane.setOnMouseMoved(mouseHandler);
pane.setOnMousePressed(mouseHandler);
pane.setOnMouseReleased(mouseHandler);
rect = new Rectangle();
rect.setFill(Color.web("blue", 0.1));
rect.setStroke(Color.BLUE);
rect.setStrokeDashOffset(50);
rect.widthProperty().bind(rectX.subtract(rectinitX));
rect.heightProperty().bind(rectY.subtract(rectinitY));
pane.getChildren().add(rect);
return Mainpane;
}
private StackPane addpane(LineChart lineChart){
StackPane Subpane = new StackPane();
Subpane.getChildren().add(lineChart);
return Subpane;
}
EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
if (mouseEvent.getButton() == MouseButton.PRIMARY) {
if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
rect.setX(mouseEvent.getX());
rect.setY(mouseEvent.getY());
rectinitX.set(mouseEvent.getX());
rectinitY.set(mouseEvent.getY());
System.out.println("rect:"+rect);
} else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) {
rectX.set(mouseEvent.getX());
rectY.set(mouseEvent.getY());
} else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
if ((rectinitX.get() >= rectX.get()) && (rectinitY.get() >= rectY.get())) {
//Condizioni Iniziali
LineChart lineChart = lineChart2;
// ((CategoryAxis) lineChart.getXAxis()).setLowerBound(initXLowerBound);
//((CategoryAxis) lineChart.getXAxis()).setUpperBound(initXUpperBound);
((NumberAxis) lineChart.getYAxis()).setLowerBound(initYLowerBound);
((NumberAxis) lineChart.getYAxis()).setUpperBound(initYUpperBound);
} else {
//Zoom In
double Tgap = 0;
double newLowerBound, newUpperBound, axisShift;
double xScaleFactor, yScaleFactor;
double xaxisShift, yaxisShift;
LineChart lineChart = lineChart2;
// Zoom in Y-axis by changing bound range.
NumberAxis yAxis = (NumberAxis) lineChart.getYAxis();
Tgap = yAxis.getHeight()/(yAxis.getUpperBound() - yAxis.getLowerBound());
axisShift = getSceneShiftY(yAxis);
yaxisShift = axisShift;
System.out.println("yAxisUPPER:"+yAxis.getUpperBound()+"yAxisLOWER:"+ yAxis.getLowerBound());
newUpperBound = yAxis.getUpperBound() - ((rectinitY.get() - axisShift)/Tgap);
newLowerBound = yAxis.getUpperBound() - ((rectY.get() - axisShift)/Tgap);
if (newUpperBound > yAxis.getUpperBound())
newUpperBound = yAxis.getUpperBound();
yScaleFactor = (yAxis.getUpperBound() - yAxis.getLowerBound())/(newUpperBound - newLowerBound);
yAxis.setLowerBound(newLowerBound);
yAxis.setUpperBound(newUpperBound);
/*XYChart.Series series1 = (Series) lineChart.getData().get(0);
if (!series1.getData().isEmpty()) {
series1.getData().remove(0);
series1.getData().remove(series1.getData().size() - 1);
}*/
// CategoryAxis xAxis = (CategoryAxis) lineChart.getXAxis();
}
// Hide the rectangle
rectX.set(0);
rectY.set(0);
}
}// end if (mouseEvent.getButton() == MouseButton.PRIMARY)
}
};
private static double getSceneShiftX(Node node) {
double shift = 0;
do {
shift += node.getLayoutX();
node = node.getParent();
} while (node != null);
return shift;
}
private static double getSceneShiftY(Node node) {
double shift = 0;
do {
shift += node.getLayoutY();
node = node.getParent();
} while (node != null);
return shift;
}
public static void main(String[] args) {
launch(args);
}
}