Charts javafx2.x;在图表上绘制仍然存在问题+;快速移动
我仍然在努力解决这个我无法解决的难题:下面的代码通过鼠标左键单击并拖动图表(从左上到右下)来执行缩放(放大),并从右下到左上恢复到原来的形式 鼠标右键单击并拖动执行徒手绘制:问题是,如果我绘制然后缩放,绘制的内容将被替换,而不是我以前绘制的位置 如何解决这个问题 谢谢 代码如下:Charts javafx2.x;在图表上绘制仍然存在问题+;快速移动,charts,javafx-2,zooming,draw,Charts,Javafx 2,Zooming,Draw,我仍然在努力解决这个我无法解决的难题:下面的代码通过鼠标左键单击并拖动图表(从左上到右下)来执行缩放(放大),并从右下到左上恢复到原来的形式 鼠标右键单击并拖动执行徒手绘制:问题是,如果我绘制然后缩放,绘制的内容将被替换,而不是我以前绘制的位置 如何解决这个问题 谢谢 代码如下: public class Zoom extends Application { Path path;//Add path for freehand BorderPane pane; Recta
public class Zoom extends Application {
Path path;//Add path for freehand
BorderPane pane;
Rectangle rect;
SimpleDoubleProperty rectinitX = new SimpleDoubleProperty();
SimpleDoubleProperty rectinitY = new SimpleDoubleProperty();
SimpleDoubleProperty rectX = new SimpleDoubleProperty();
SimpleDoubleProperty rectY = new SimpleDoubleProperty();
double initXLowerBound = 0, initXUpperBound = 0, initYLowerBound = 0, initYUpperBound = 0;
@Override
public void start(Stage stage) {
stage.setTitle("Lines plot");
//final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis xAxis = new NumberAxis(1, 12, 1);
final NumberAxis yAxis = new NumberAxis(0.53000, 0.53910, 0.0005);
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(true);
XYChart.Series series1 = new XYChart.Series();
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));
series1.getData().add(new XYChart.Data(11, 0.530123));
series1.getData().add(new XYChart.Data(12, 0.53035));
pane = new BorderPane();
pane.setCenter(lineChart);
// Scene scene = new Scene(lineChart, 800, 600);
Scene scene = new Scene(pane, 800, 600);
lineChart.getData().addAll(series1);
initXLowerBound = ((NumberAxis) lineChart.getXAxis()).getLowerBound();
initXUpperBound = ((NumberAxis) lineChart.getXAxis()).getUpperBound();
initYLowerBound = ((NumberAxis) lineChart.getYAxis()).getLowerBound();
initYUpperBound = ((NumberAxis) lineChart.getYAxis()).getUpperBound();
stage.setScene(scene);
path = new Path();
path.setStrokeWidth(1);
path.setStroke(Color.BLACK);
scene.setOnMouseClicked(mouseHandler);
scene.setOnMouseDragged(mouseHandler);
scene.setOnMouseEntered(mouseHandler);
scene.setOnMouseExited(mouseHandler);
scene.setOnMouseMoved(mouseHandler);
scene.setOnMousePressed(mouseHandler);
scene.setOnMouseReleased(mouseHandler);
//root.getChildren().add(lineChart);
pane.getChildren().add(path);
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);
stage.show();
}
// sum layout shift against parent until we ascend to scene
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());
} 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<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter();
((NumberAxis) lineChart.getXAxis()).setLowerBound(initXLowerBound);
((NumberAxis) lineChart.getXAxis()).setUpperBound(initXUpperBound);
((NumberAxis) lineChart.getYAxis()).setLowerBound(initYLowerBound);
((NumberAxis) lineChart.getYAxis()).setUpperBound(initYUpperBound);
ZoomFreeHand(path, 1.0, 1.0, 0, 0);
} else {
//Zoom In
double Tgap = 0;
double newLowerBound, newUpperBound, axisShift;
double xScaleFactor, yScaleFactor;
double xaxisShift, yaxisShift;
// System.out.println("Zoom bounds : [" + rectinitX.get() + ", " +rectinitY.get()
// + "] ["+ rectX.get()+", "+rectY.get()+"]");
// System.out.println("TODO: Determine bound ranges according these zoom coordinates.\n");
// TODO: Determine bound ranges according this zoom coordinates.
//LineChart<String, Number> lineChart = (LineChart<String, Number>) pane.getCenter();
LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter();
// 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;
newUpperBound = yAxis.getUpperBound() - ((rectinitY.get() - axisShift) / Tgap);
newLowerBound = yAxis.getUpperBound() - (( rectY.get() - axisShift) / Tgap);
// System.out.println("(a) rectinitY.get() "+rectinitY.get()+" rectY.get() "+rectY.get());
// System.out.println("(a) Tgap "+Tgap+" axisShift "+axisShift+" yAxis.getLowerBound() "
// + yAxis.getLowerBound()+ " " + yAxis.getUpperBound());
if (newUpperBound > yAxis.getUpperBound())
newUpperBound = yAxis.getUpperBound();
yScaleFactor = (yAxis.getUpperBound() - yAxis.getLowerBound())/(newUpperBound - newLowerBound);
yAxis.setLowerBound(newLowerBound);
yAxis.setUpperBound(newUpperBound);
// System.out.println("(b) yAxis.getLowerBound() " + yAxis.getLowerBound()+ " "
// + yAxis.getUpperBound());
// Zoom in X-axis by removing first and last data values.
// Note: Maybe better if categoryaxis is replaced by numberaxis then setting the
// LowerBound and UpperBound will be avaliable.
/*
XYChart.Series series1 = lineChart.getData().get(0);
if (!series1.getData().isEmpty()) {
series1.getData().remove(0);
series1.getData().remove(series1.getData().size() - 1);
}
*/
NumberAxis xAxis = (NumberAxis) lineChart.getXAxis();
// System.out.println("(a) xAxis.getLowerBound() " + xAxis.getLowerBound()+ " "
// + xAxis.getUpperBound());
Tgap = xAxis.getWidth()/(xAxis.getUpperBound() - xAxis.getLowerBound());
// newXlower = (rectinitX.get()/Tgap) + xAxis.getLowerBound();
// newXupper = (rectX.get()/Tgap)+xAxis.getLowerBound();
axisShift = getSceneShiftX(xAxis);
xaxisShift = axisShift;
newLowerBound = ((rectinitX.get() - axisShift) / Tgap) + xAxis.getLowerBound();
newUpperBound = ((rectX.get() - axisShift) / Tgap) + xAxis.getLowerBound();
if (newUpperBound > xAxis.getUpperBound())
newUpperBound = xAxis.getUpperBound();
xScaleFactor = (xAxis.getUpperBound() - xAxis.getLowerBound())/(newUpperBound - newLowerBound);
xAxis.setLowerBound( newLowerBound );
xAxis.setUpperBound( newUpperBound );
// System.out.println("(b) xAxis.getLowerBound() "+xAxis.getLowerBound()+" "+xAxis.getUpperBound());
ZoomFreeHand(path, xScaleFactor, yScaleFactor, xaxisShift, yaxisShift);
}
// Hide the rectangle
rectX.set(0);
rectY.set(0);
}
}// end if (mouseEvent.getButton() == MouseButton.PRIMARY)
else if (mouseEvent.getButton() == MouseButton.SECONDARY) //free hand graphics
{
if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
path.getElements().clear();
path.getElements().add(new MoveTo(mouseEvent.getX(), mouseEvent.getY()));
} else if (mouseEvent.getEventType()==MouseEvent.MOUSE_DRAGGED) {
path.getElements().add(new LineTo(mouseEvent.getX(), mouseEvent.getY()));
}
} //end if (mouseEvent.getButton() == MouseButton.SECONDARY)
}
};
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;
}
private static void ZoomFreeHand(Path path, double xScaleFactor, double yScaleFactor,
double xaxisShift, double yaxisShift) {
/*
ObservableList<PathElement> ListPath = path.getElements();
if (ListPath.size() != 0) {
MoveTo moveto;
((MoveTo)(ListPath.get(0))).setX(0-axisShiftX);
((MoveTo)(ListPath.get(0))).setY(0-axisShiftY);
}
*/
path.setScaleX(xScaleFactor);
path.setScaleY(yScaleFactor);
path.setTranslateX(xaxisShift);
path.setTranslateY(yaxisShift);
}
public static void main(String[] args) {
launch(args);
}
}
公共类缩放扩展应用程序{
Path Path;//为徒手画添加路径
边框窗格;
矩形矩形;
SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectiny=新的SimpleDoubleProperty();
SimpleDoubleProperty rectX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectY=新的SimpleDoubleProperty();
双initXLowerBound=0,initXUpperBound=0,initYLowerBound=0,initYUpperBound=0;
@凌驾
公众假期开始(阶段){
舞台布景标题(“线条图”);
//最终CategoryAxis xAxis=新CategoryAxis();
最终数字xis xAxis=新数字xis(1,12,1);
最终数值轴=新数值轴(0.53000,0.53910,0.0005);
yAxis.setTickLabelFormatter(新编号Axis.DefaultFormatter(yAxis){
@凌驾
公共字符串toString(数字对象){
返回String.format(“%7.5f”,对象);
}
});
最终线形图线形图=新线形图(xAxis,yAxis);
lineChart.setCreateSynumbles(false);
线形图.setAlternativeRowFillVisible(假);
lineChart.setAnimated(真);
XYChart.Series系列1=新的XYChart.Series();
series1.getData().add(新的XYChart.Data(1,0.53185));
series1.getData().add(新的XYChart.Data(2,0.532235));
series1.getData().add(新的XYChart.Data(3,0.53234));
series1.getData().add(新的XYChart.Data(4,0.538765));
series1.getData().add(新的XYChart.Data(5,0.53442));
series1.getData().add(新的XYChart.Data(6,0.534658));
series1.getData().add(新的XYChart.Data(7,0.53023));
series1.getData().add(新的XYChart.Data(8,0.53001));
series1.getData().add(新的XYChart.Data(9,0.53589));
series1.getData().add(新的XYChart.Data(10,0.53476));
series1.getData().add(新的XYChart.Data(11,0.530123));
series1.getData().add(新的XYChart.Data(12,0.53035));
窗格=新边框窗格();
窗格。设置中心(折线图);
//场景=新场景(线条图,800600);
场景=新场景(窗格,800600);
lineChart.getData().addAll(series1);
initXLowerBound=((NumberAxis)lineChart.getXAxis()).getLowerBound();
initXUpperBound=((NumberAxis)lineChart.getXAxis()).getUpperBound();
initYLowerBound=((NumberAxis)lineChart.getYAxis()).getLowerBound();
initYUpperBound=((NumberAxis)lineChart.getYAxis()).getUpperBound();
舞台场景;
路径=新路径();
路径设置行程宽度(1);
路径设定行程(颜色为黑色);
场景。setOnMouseClicked(鼠标手柄);
场景。SetonMouseDrawed(鼠标手柄);
场景。setOnMouseEntered(鼠标手柄);
场景:setOnMouseExited(鼠标手柄);
场景:setOnMouseMoved(鼠标手柄);
场景。设置鼠标按下(鼠标手柄);
场景。setOnMouseReleased(鼠标手柄);
//root.getChildren().add(折线图);
pane.getChildren().add(路径);
rect=新矩形();
矩形设置填充(Color.web(“蓝色”,0.1));
直接设定行程(颜色为蓝色);
直接设定行程偏移量(50);
widthProperty()绑定(rectX.subtract(rectinitX));
rect.heightProperty().bind(rectY.subtract(rectinitY));
pane.getChildren().add(rect);
stage.show();
}
//求和布局相对于父对象的偏移,直到我们上升到场景
EventHandler mouseHandler=neweventhandler(){
@凌驾
公共无效句柄(MouseEvent MouseEvent){
if(mouseEvent.getButton()==MouseButton.PRIMARY){
if(mouseEvent.getEventType()==mouseEvent.MOUSE_按下){
setX(mouseEvent.getX());
setY(mouseEvent.getY());
rectinitX.set(mouseEvent.getX());
set(mouseEvent.getY());
}else if(mouseEvent.getEventType()==mouseEvent.MOUSE\u拖动){
set(mouseEvent.getX());
set(mouseEvent.getY());
}else if(mouseEvent.getEventType()==mouseEvent.MOUSE_已释放){
if((rectinitX.get()>=rectX.get())&&(rectinitY.get()>=rectY.get()){
//条件化
折线图折线图=(折线图)窗格。getCenter();
((NumberAxis)lineChart.getXAxis()).setLowerBound(initXLowerBound);
((NumberAxis)lineChart.getXAxis()).setUpperBound(initXUpperBound);
((NumberAxis)lineChart.getYAxis()).setLowerBound(initYLowerBound);
((NumberAxis)lineChart.getYAxis()).setUpperBound(inityupperbund);
ZoomFreeHand(路径,1.0,1.0,0,0);
}否则{
//放大
双Tgap=0;
双newLowerBound、newUpperBound、axisShift;
双xScaleFactor,yScaleFactor;
双X轴位移、Y轴位移;
//System.out.println(“缩放边界:[“+rectinitX.get()+”,“+rectinitY.get())
//+“][“+rectX.get()+”,“+rectY.get()+”);
//System.out.println(“TODO:根据这些缩放坐标确定边界范围。\n”);
//TODO:根据此缩放坐标确定边界范围。
//折线图折线图=(折线图)窗格。getCenter();
Pane root = new Pane();
root.getChildren().add( new Line( 10, 10, 100, 100 ) );
root.setOnScroll( new ScrollHandler() );
private class ScrollHandler implements EventHandler< ScrollEvent > {
@Override
public void handle( ScrollEvent event ) {
root.setScaleX( root.getScaleX() + event.getDeltaY() * .005 );
root.setScaleY( root.getScaleY() + event.getDeltaY() * .005 );
}
}
yAxis.setLowerBound(10);
yAxis.setUpperBound(100);
yAxis.setTickUnit(5);