1

此代码在拆分窗格中绘制两条 XYChart 线,并仅在上部窗格中绘制一条水平线。

在此处输入图像描述

当鼠标指针移动到下部窗格时,我希望在下部子窗格中也有这条水平线。

如何做到这一点?

谢谢

这是代码

import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Orientation;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.*;
import javafx.scene.control.SplitPane;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.LineBuilder;
import javafx.stage.Stage;


public class XyChartHorizontalLine extends Application {

SplitPane               splitPane1 = null; 
BorderPane              pane1; 
BorderPane              pane2; 
Line                    LH;
XYChart.Series          series1 = new XYChart.Series(); 
XYChart.Series          series2 = new XYChart.Series(); 

@Override
public void start(Stage stage) {      
stage.setTitle("Lines plot"); 

final NumberAxis xAxis = new NumberAxis(1, 12, 1); 
final NumberAxis yAxis = new NumberAxis(0.53000, 0.53910, 0.0005); 

xAxis.setAnimated(false);
xAxis.setScaleX(0);
yAxis.setAnimated(false);

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

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

final LineChart<Number, Number> lineChart1 = new LineChart<Number, Number>(xAxis,  yAxis); 

lineChart1.setCreateSymbols(false); 
lineChart1.setAlternativeRowFillVisible(false); 
lineChart1.setAnimated(false); 
lineChart1.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)); 

lineChart1.getData().addAll(series1);         

pane1 = new BorderPane(); 
pane1.setCenter(lineChart1); 

splitPane1 = new SplitPane();                                
splitPane1.setOrientation(Orientation.VERTICAL);
splitPane1.getItems().addAll(pane1);
splitPane1.setDividerPosition(0, 1);

final NumberAxis xAxis2 = new NumberAxis(1, 12, 1);
final NumberAxis   yAxis2 = new NumberAxis();

yAxis2.setTickUnit(1);
yAxis2.setPrefWidth(35);
yAxis2.setMinorTickCount(10);

yAxis2.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis2){
    @Override
    public String toString(Number object){
        String label;
        label = String.format("%7.2f", object.floatValue());
        return label;
    }
});

LineChart<Number, Number>lineChart2 = new LineChart<Number, Number>(xAxis2, yAxis2);

lineChart2.setAlternativeRowFillVisible(false);
lineChart2.setLegendVisible(false);
lineChart2.setAnimated(false);
lineChart2.setCreateSymbols(false);

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

series2.getData().add(new XYChart.Data(1, 1));
series2.getData().add(new XYChart.Data(2, 3));
series2.getData().add(new XYChart.Data(3, 1.5));
series2.getData().add(new XYChart.Data(4, 3));
series2.getData().add(new XYChart.Data(5, 4.5));
series2.getData().add(new XYChart.Data(6, 5));
series2.getData().add(new XYChart.Data(7, 4));
series2.getData().add(new XYChart.Data(8, 8));
series2.getData().add(new XYChart.Data(9, 16.5));
series2.getData().add(new XYChart.Data(10, 13.9));
series2.getData().add(new XYChart.Data(11, 17));
series2.getData().add(new XYChart.Data(12, 20));

lineChart2.getData().addAll(series2);

pane2 = new BorderPane(); 
pane2.setCenter(lineChart2);

Platform.runLater(new Runnable() {
 @Override
 public void run() {
     double percSplit;

     splitPane1.getItems().addAll(pane2);

    ObservableList<SplitPane.Divider> splitDiv =  splitPane1.getDividers();

    percSplit = 1/(double)(splitDiv.size()+1);
    for (int i = 0; i< splitDiv.size(); i++) {                        
        splitPane1.setDividerPosition(i, percSplit);
        percSplit += 1/(double)(splitDiv.size()+1);
        }
 }
 });

Scene scene = new Scene(splitPane1, 800, 600); 
stage.setScene(scene);         

pane1.setOnMouseMoved(mouseHandler); 

LH=LineBuilder.create()
    .startX(0)
    .startY(0)
    .endX(10)
    .endY(.535)
    .strokeWidth(1)
    .stroke(Color.BLACK)
    .build();
 pane1.getChildren().add(LH);

stage.show();
} 
EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 

@Override 
public void handle(MouseEvent mouseEvent) {
if (mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED) { 
    LineChart<Number, Number> lineChart = (LineChart<Number, Number>)     pane1.getCenter(); 

    NumberAxis yAxis = (NumberAxis) lineChart.getYAxis(); 
    NumberAxis xAxis = (NumberAxis) lineChart.getXAxis(); 

    double newXlower=xAxis.getLowerBound(), newXupper=xAxis.getUpperBound(); 

    double xAxisShift = getSceneShift(xAxis);
    double yAxisShift = getSceneShift(yAxis);

    if(mouseEvent.getX()>xAxisShift && mouseEvent.getX()<xAxisShift+xAxis.getWidth()){

    LH.setStartX(xAxisShift);
    LH.setStartY(mouseEvent.getY());
    LH.setEndX(xAxisShift+xAxis.getWidth());
    LH.setEndY(mouseEvent.getY());
    }
} 
}
}; 
private static double getSceneShift(Node node) { 
double shift = 0; 
do {  
  shift += node.getLayoutX();  
  node = node.getParent(); 
} 
while (node != null); 
  return shift; 
}   
public static void main(String[] args) { 
launch(args);  
} 
}
4

0 回答 0