JavaFx 2.x: How to extend horizontal line on subpa

2019-08-09 06:26发布

This code plots two XYChart lines in a Splitpane, and draw an horizontal line only in the upper pane.

enter image description here

I would like to have this horizontal line also in lower subpane(s) when mouse pointer is moved to the lower pane.

How to accomplish this?

Thanks

Here is the code

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

0条回答
登录 后发表回答