Javafx 2 如何克隆X轴和Y轴?

Javafx 2 如何克隆X轴和Y轴?,javafx-2,bar-chart,scatter-plot,linechart,Javafx 2,Bar Chart,Scatter Plot,Linechart,我有一个柱状图和一个折线图,两个不同的系列 barChart.getData().addAll(series1); lineChart.getData().addAll(series2); 我的问题:是否可能以及如何克隆条形图轴,以便获得与线形图相同的设置 我想要的是一个完美的轴设置重叠 谢谢 编辑:在此链接 我看到有一个从类java.lang.Object继承的克隆方法 我如何使用这个方法 谢谢大家 Edit2:下面是一个示例类来显示我的问题:它绘制一个折线图,并通过单击AddSeri

我有一个柱状图和一个折线图,两个不同的系列

barChart.getData().addAll(series1); 
lineChart.getData().addAll(series2); 
我的问题:是否可能以及如何克隆条形图轴,以便获得与线形图相同的设置

我想要的是一个完美的轴设置重叠

谢谢

编辑:在此链接

我看到有一个从类java.lang.Object继承的克隆方法

我如何使用这个方法

谢谢大家

Edit2:下面是一个示例类来显示我的问题:它绘制一个折线图,并通过单击AddSerie按钮添加散点图

当绘制黄色点时,两个轴重叠,但只需通过鼠标左键单击并拖动图表上的任意位置将图表向左/向右或向上/向下移动,轴就会失去同步

通过鼠标左键单击并拖动X轴或Y轴进行轴扩展/压缩时也会遇到同样的问题

import java.util.Set;
import javafx.application.Application; 
import javafx.beans.property.SimpleDoubleProperty; 
import javafx.event.ActionEvent;
import javafx.event.EventHandler; 
import javafx.geometry.Side;
import javafx.scene.Group;
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.Node; 
import javafx.scene.chart.*; 
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.StackPane;

public class RescalingSeries extends Application {

StackPane               mainGraphStackPane = null;
Button btnAdd;
BorderPane pane; 

XYChart.Series series1 = new XYChart.Series(); 

SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
SimpleDoubleProperty rectinitY = new SimpleDoubleProperty(); 

protected static Axis _duplicateAxis(Axis axis, Axis result) {

    result.setAnimated(axis.animatedProperty().get());
    result.setAutoRanging(axis.isAutoRanging());
    result.setLabel(axis.getLabel());
    result.setSide(axis.getSide());
    result.setTickLabelFill(axis.getTickLabelFill());
    result.setTickLabelFont(axis.getTickLabelFont());
    result.setTickLabelGap(axis.getTickLabelGap());
    result.setTickLength(axis.getTickLength());
    return result;
}

protected static ValueAxis _duplicateValueAxis(ValueAxis axis, ValueAxis result) {
    _duplicateAxis(axis, result);
    result.setLowerBound(axis.getLowerBound());
    result.setUpperBound(axis.getUpperBound());
    result.setMinorTickCount(axis.getMinorTickCount());
    result.setMinorTickLength(axis.getMinorTickLength());
    result.setTickLabelFormatter(axis.getTickLabelFormatter());
    return result;
}

/**
 * Duplicate a number axis.
 * @param axis The source axis.
 * @return A {@code NumberAxis}, never {@code null}.
 */
public static NumberAxis duplicateNumberAxis(NumberAxis axis) {
    NumberAxis result = new NumberAxis();
    _duplicateValueAxis(axis, result);
    result.setTickUnit(axis.getTickUnit());
    result.setForceZeroInRange(axis.isForceZeroInRange());
    return result;
}

/**
 * Duplicate a category axis.
 * @param axis The source axis.
 * @return A {@code CategoryAxis}, never {@code null}.
 */
public static CategoryAxis duplicateCategoryAxis(CategoryAxis axis) {
    CategoryAxis result = new CategoryAxis(axis.getCategories());
    _duplicateAxis(axis, result);
    result.setStartMargin(axis.getStartMargin());
    result.setEndMargin(axis.getEndMargin());
    result.setGapStartAndEnd(axis.gapStartAndEndProperty().get());
    return result;
}

@Override 
public void start(Stage stage) { 

final NumberAxis xAxisLC = new NumberAxis(1, 12, 1); 
final NumberAxis yAxisLC = new NumberAxis(0.53000, 0.53910, 0.0005);
yAxisLC.setSide(Side.RIGHT);

yAxisLC.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxisLC) { 

    @Override 
    public String toString(Number object) { 
        return String.format("%7.5f", object); 
    } 
}); 

final LineChart<Number, Number> lineChart = new LineChart<>(xAxisLC, yAxisLC); 

lineChart.setCreateSymbols(false); 
lineChart.setAlternativeRowFillVisible(false); 
lineChart.setAnimated(true); 
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)); 
series1.getData().add(new XYChart.Data(11, 0.530123)); 
series1.getData().add(new XYChart.Data(12, 0.531035)); 

pane = new BorderPane(); 
pane.setCenter(lineChart);
mainGraphStackPane = new StackPane();
mainGraphStackPane.getChildren().add(pane);
Scene scene = new Scene(mainGraphStackPane, 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); 

Group root = new Group();
btnAdd = new Button();
btnAdd.setText("Add serie");
root.getChildren().add(btnAdd);
pane.getChildren().add(root);              

btnAdd.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {        
        NumberAxis xAxisBC = duplicateNumberAxis(xAxisLC);
        NumberAxis yAxisBC = duplicateNumberAxis(yAxisLC);
        ScatterChart<Number, Number> scatterChart = new ScatterChart<>(xAxisBC, yAxisBC); 

        scatterChart.setAlternativeRowFillVisible(false); 
        scatterChart.setAnimated(true); 
        scatterChart.setLegendVisible(false);

        XYChart.Series series2 = new XYChart.Series();

        series2.getData().add(new XYChart.Data(1, 0.53185)); 
        series2.getData().add(new XYChart.Data(2, 0.532235)); 
        series2.getData().add(new XYChart.Data(3, 0.53234)); 
        series2.getData().add(new XYChart.Data(4, 0.538765)); 
        series2.getData().add(new XYChart.Data(5, 0.53442)); 
        series2.getData().add(new XYChart.Data(6, 0.534658)); 
        series2.getData().add(new XYChart.Data(7, 0.53023)); 
        series2.getData().add(new XYChart.Data(8, 0.53001)); 
        series2.getData().add(new XYChart.Data(9, 0.53589)); 
        series2.getData().add(new XYChart.Data(10, 0.53476)); 
        series2.getData().add(new XYChart.Data(11, 0.530123)); 
        series2.getData().add(new XYChart.Data(12, 0.531035));

        scatterChart.getData().addAll(series2);

        Set<Node> chartNode = scatterChart.lookupAll(".chart-plot-background");
        for(final Node chr : chartNode){
            chr.setStyle("-fx-background-color: transparent;");                           
        }                                                
        chartNode = lineChart.lookupAll(".chart-plot-background");
        for(final Node chr : chartNode){
            chr.setStyle("-fx-background-color: transparent");                            
        }
        mainGraphStackPane.getChildren().add(scatterChart);

        xAxisBC.lowerBoundProperty().bind(xAxisLC.lowerBoundProperty());
        yAxisBC.lowerBoundProperty().bind(yAxisLC.lowerBoundProperty());      
    }
});

stage.show(); 
} 

EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 

@Override 
public void handle(MouseEvent mouseEvent) { 
    boolean XScaling=false;
    boolean YScaling=false;

   if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED ){ 
        LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter(); 
        NumberAxis yAxis = (NumberAxis) lineChart.getYAxis(); 
        NumberAxis xAxis = (NumberAxis) lineChart.getXAxis(); 

        double Tgap = xAxis.getWidth()/(xAxis.getUpperBound() - xAxis.getLowerBound()); 
        double newXlower=xAxis.getLowerBound(), newXupper=xAxis.getUpperBound(); 
        double newYlower=yAxis.getLowerBound(), newYupper=yAxis.getUpperBound(); 

        double xAxisShift = xAxis.localToScene(0, 0).getX();
        double yAxisShift = yAxis.localToScene(0, 0).getY();

        double yAxisStep=yAxis.getHeight()/(yAxis.getUpperBound()-yAxis.getLowerBound());
        double CurrentPrice=yAxis.getUpperBound()-((mouseEvent.getY()-yAxisShift)/yAxisStep);

        double Delta=0.3;
        if(mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED && mouseEvent.getX()<xAxisShift+yAxis.getHeight() && mouseEvent.getY()<yAxisShift+yAxis.getHeight() && (XScaling==false || YScaling==false)){

  //==================================================== X-Axis Moving     ==================================

            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 ); 

//===================================================== Y-Axis Moving ====================================

            if(rectinitY.get() < mouseEvent.getY()){    
                newYlower=yAxis.getLowerBound()+Delta/1000;
                newYupper=yAxis.getUpperBound()+Delta/1000;
            }
            else if(rectinitY.get() > mouseEvent.getY()){    
                newYlower=yAxis.getLowerBound()-Delta/1000;
                newYupper=yAxis.getUpperBound()-Delta/1000;
            }
            yAxis.setLowerBound(newYlower);
            yAxis.setUpperBound(newYupper);
        }

//----------------------------- Re-Scale the X-Axis when dragging below it ---------------------------------

        else if(mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED && mouseEvent.getY()>yAxisShift+yAxis.getHeight() ){
            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 );           
        }

//--------------------------------- Re-Scale the Y-Axis when dragging to the left of it --------------------------

        else if(mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED && mouseEvent.getX()> (xAxisShift + xAxis.getWidth())){
            if(rectinitY.get() < mouseEvent.getY()){    
                newYlower=yAxis.getLowerBound()-Delta/1000;
                newYupper=yAxis.getUpperBound()+Delta/1000;
            }
            else if(rectinitY.get() > mouseEvent.getY()){    
                newYlower=yAxis.getLowerBound()+Delta/1000;
                newYupper=yAxis.getUpperBound()-Delta/1000;
            }
            yAxis.setLowerBound(newYlower);
            yAxis.setUpperBound(newYupper);                
        }             
        rectinitX.set(mouseEvent.getX()); 
        rectinitY.set(mouseEvent.getY()); 

        if(mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED && mouseEvent.getY()>yAxisShift && mouseEvent.getY()<yAxisShift+yAxis.getHeight() && mouseEvent.getX()>xAxisShift && mouseEvent.getX()<xAxisShift+xAxis.getWidth()){

        double XX=((mouseEvent.getX() - xAxisShift) / Tgap) + xAxis.getLowerBound();
        double YY=CurrentPrice;
        series1.setName(String.format("%.2g%n",XX) + ", " + String.format("%.4g%n",YY));
        }          
     } 
} 
}; 

public static void main(String[] args) { 
launch(args);  
} 
}
import java.util.Set;
导入javafx.application.application;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Side;
导入javafx.scene.Group;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.XYChart;
导入javafx.stage.stage;
导入javafx.scene.scene;
导入javafx.scene.Node;
导入javafx.scene.chart.*;
导入javafx.scene.control.Button;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.StackPane;
公共类RescalingSeries扩展了应用程序{
StackPane mainGraphStackPane=null;
按钮btnAdd;
边框窗格;
XYChart.Series系列1=新的XYChart.Series();
SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectiny=新的SimpleDoubleProperty();
受保护的静态轴\u复制轴(轴、轴结果){
result.setAnimated(axis.animatedProperty().get());
result.setAutoRanging(axis.isAutoRanging());
result.setLabel(axis.getLabel());
result.setSide(axis.getSide());
result.setTickLabelFill(axis.getTickLabelFill());
result.setTickLabelFont(axis.getTickLabelFont());
result.setTickLabelGap(axis.getTickLabelGap());
result.setTickLength(axis.getTickLength());
返回结果;
}
受保护的静态ValueAxis\u duplicateValueAxis(ValueAxis轴,ValueAxis结果){
_复制轴(轴,结果);
result.setLowerBound(axis.getLowerBound());
result.setUpperBound(axis.getUpperBound());
result.setMinorTickCount(axis.getMinorTickCount());
result.setMinorTickLength(axis.getMinorTickLength());
result.setTickLabelFormatter(axis.getTickLabelFormatter());
返回结果;
}
/**
*复制一个数字轴。
*@param axis源轴。
*@返回一个{@code NumberAxis},从不{@code null}。
*/
公共静态数字轴重复数字轴(数字轴){
NumberAxis结果=新的NumberAxis();
_复制值轴(轴、结果);
result.setTickUnit(axis.getTickUnit());
结果.setForceZeroInRange(axis.isForceZeroInRange());
返回结果;
}
/**
*复制类别轴。
*@param axis源轴。
*@返回一个{@code CategoryAxis},从不{@code null}。
*/
公共静态类别轴重复类别轴(类别轴){
CategoryAxis结果=新的CategoryAxis(axis.getCategories());
_复制轴(轴,结果);
结果.setStartMargin(axis.getStartMargin());
result.setEndMargin(axis.getEndMargin());
result.setGapStartAndEnd(axis.gapStartAndEndProperty().get());
返回结果;
}
@凌驾
公众假期开始(阶段){
最终数字xis xAxisLC=新数字xis(1,12,1);
最终数字xis yAxisLC=新数字xis(0.53000,0.53910,0.0005);
yAxisLC.setSide(右侧);
setTickLabelFormatter(新数字Axis.DefaultFormatter(yAxisLC){
@凌驾
公共字符串toString(数字对象){
返回String.format(“%7.5f”,对象);
} 
}); 
最终线形图线形图=新线形图(xAxisLC、yAxisLC);
lineChart.setCreateSynumbles(false);
线形图.setAlternativeRowFillVisible(假);
lineChart.setAnimated(真);
线形图。setLegendVisible(假);
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.531035));
窗格=新边框窗格();
窗格。设置中心(折线图);
mainGraphStackPane=新堆栈窗格();
mainGraphStackPane.getChildren().add(窗格);
场景=新场景(mainGraphStackPane,800600);
lineChart.getData().addAll(series1);
舞台场景;
场景。setOnMouseClicked(鼠标手柄);
场景。SetonMouseDrawed(鼠标手柄);
场景。setOnMouseEntered(鼠标手柄);
场景:setOnMouseExited(鼠标手柄);
场景:setOnMouseMoved(鼠标手柄);
场景。设置鼠标按下(鼠标手柄);
场景。setOnMouseReleased(鼠标手柄);
组根=新组();
btnAdd=新按钮();
btnAdd.setText(“添加系列”);
root.getChildren().add(btnAdd);
pane.getChildren().add(根目录);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
NumberAxis xAxisBC=重复NumberAxis(xAxisLC);
NumberAxis yAxisBC=重复NumberAxis(yAxisLC);
散射图散射图=新的散射图(xAxisBC、yAxisBC);
散点图。setAlternativeRowFillVisible(假);
散点图。设置动画(真);
散点图。setLegendVisible(假);
XYChart.Series系列2=新的XYChart.Series();
Chart, Axis, and Series