JavaFx 2.x: How to extend horizontal line on subpane(s)?

故事扮演 提交于 2019-12-11 08:05:16

问题


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

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

来源:https://stackoverflow.com/questions/12616843/javafx-2-x-how-to-extend-horizontal-line-on-subpanes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!