Javafx 2 javafx2.x:XY折线图:Y轴上方的折线图

Javafx 2 javafx2.x:XY折线图:Y轴上方的折线图,javafx-2,linechart,Javafx 2,Linechart,此代码在图表上绘制一条黑线的折线图:当向左/向右滚动(鼠标左键单击并拖动)时,黑线位于Y轴的左、右上方,而黄色的木线位于Y轴的下方 如何修改此代码,使黑线保持在Y轴下方 谢谢 import javafx.application.Application; import javafx.beans.binding.DoubleBinding; import javafx.beans.property.SimpleDoubleProperty; import javafx.event.EventHa

此代码在图表上绘制一条黑线的折线图:当向左/向右滚动(鼠标左键单击并拖动)时,黑线位于Y轴的左、右上方,而黄色的木线位于Y轴的下方

如何修改此代码,使黑线保持在Y轴下方

谢谢

import javafx.application.Application; 
import javafx.beans.binding.DoubleBinding;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class GridMoveAndLine extends Application {

BorderPane pane;
Line       newLine;
XYChart.Series series1 = new XYChart.Series(); 

SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
SimpleDoubleProperty rectX = new SimpleDoubleProperty(); 
SimpleDoubleProperty rectY = new SimpleDoubleProperty(); 

double oldXLowerBound = -1;
double oldXUpperBound = -1;
double oldYLowerBound = -1;
double oldYUpperBound = -1;

@Override 
public void start(Stage stage) { 

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

xAxis.setAnimated(false);
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> lineChart = new LineChart<Number, Number>(xAxis, yAxis); 

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

pane = new BorderPane(); 
pane.setCenter(lineChart); 
Scene scene = new Scene(pane, 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); 
stage.show();

newLine = new Line(260, 35, 390, 280);
pane.getChildren().add(newLine);

oldXLowerBound = xAxis.getLowerBound();
oldXUpperBound = xAxis.getUpperBound();

DoubleBinding LineXaxisBinding = new DoubleBinding() {
{                                
    super.bind(xAxis.lowerBoundProperty(), xAxis.upperBoundProperty(), xAxis.widthProperty());
}
@Override
protected double computeValue() {
    double chartWidthX = xAxis.getWidth();
    double axisSpanX = xAxis.getUpperBound() - xAxis.getLowerBound();
    double displacementX = (chartWidthX / axisSpanX) * ( oldXLowerBound-  xAxis.getLowerBound()  );

    return (0 + displacementX);

}
};

newLine.translateXProperty().bind(LineXaxisBinding);
} 

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

@Override 
public void handle(MouseEvent mouseEvent) { 

if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {             
    rectinitX.set(mouseEvent.getX()); 
} 
else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED) { 
    LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter(); 
    NumberAxis xAxis = (NumberAxis) lineChart.getXAxis(); 

    double Tgap = xAxis.getWidth()/(xAxis.getUpperBound() - xAxis.getLowerBound()); 
    double newXlower=xAxis.getLowerBound(), newXupper=xAxis.getUpperBound();             
    double Delta=0.3;

    if(mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED){
    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 );                        
    }                                        
    rectinitX.set(mouseEvent.getX());                                 
 } 
 } 
 }; 
public static void main(String[] args) {
    launch(args);

}
}
导入javafx.application.application;
导入javafx.beans.binding.DoubleBinding;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.chart.LineChart;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.XYChart;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.shape.Line;
导入javafx.stage.stage;
公共类GridMoveAndLine扩展了应用程序{
边框窗格;
换行符;
XYChart.Series系列1=新的XYChart.Series();
SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectY=新的SimpleDoubleProperty();
双oldXLowerBound=-1;
双oldXUpperBound=-1;
双oldYLowerBound=-1;
双oldYUpperBound=-1;
@凌驾
公众假期开始(阶段){
最终数字xis xAxis=新数字xis(1,12,1);
最终数值轴=新数值轴(0.53000,0.53910,0.0005);
xAxis.setAnimated(false);
yAxis.setAnimated(false);
setTickLabelFormatter(新数字Axis.DefaultFormatter(yAxis){
@凌驾
公共字符串toString(数字对象){
返回String.format(“%7.5f”,对象);
} 
}); 
最终线形图线形图=新线形图(xAxis,yAxis);
lineChart.setCreateSynumbles(false);
线形图.setAlternativeRowFillVisible(假);
线形图。设置动画(假);
线形图。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));
窗格=新边框窗格();
窗格。设置中心(折线图);
场景=新场景(窗格,800600);
lineChart.getData().addAll(series1);
舞台场景;
场景。setOnMouseClicked(鼠标手柄);
场景。SetonMouseDrawed(鼠标手柄);
场景。setOnMouseEntered(鼠标手柄);
场景:setOnMouseExited(鼠标手柄);
场景:setOnMouseMoved(鼠标手柄);
场景。设置鼠标按下(鼠标手柄);
场景。setOnMouseReleased(鼠标手柄);
stage.show();
换行符=换行符(260、35、390、280);
pane.getChildren().add(换行符);
oldXLowerBound=xAxis.getLowerBound();
oldXUpperBound=xAxis.getUpperBound();
DoubleBinding LineXaxiBinding=新的DoubleBinding(){
{                                
super.bind(xAxis.lowerBoundProperty()、xAxis.upperBoundProperty()、xAxis.widthProperty());
}
@凌驾
受保护的双计算值(){
double chartWidthX=xAxis.getWidth();
双轴spanx=xAxis.getUpperBound()-xAxis.getLowerBound();
双位移X=(chartWidthX/axisSpanX)*(oldXLowerBound-xAxis.getLowerBound());
返回(0+位移x);
}
};
newLine.translateProperty().bind(LineXaxisBinding);
} 
EventHandler mouseHandler=新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent MouseEvent){
如果(mouseEvent.getEventType()==mouseEvent.MOUSE_按下){
rectinitX.set(mouseEvent.getX());
} 
如果(mouseEvent.getEventType()==mouseEvent.MOUSE_拖动| | mouseEvent.getEventType()==mouseEvent.MOUSE_移动){
折线图折线图=(折线图)窗格。getCenter();
NumberAxis xAxis=(NumberAxis)lineChart.getXAxis();
双Tgap=xAxis.getWidth()/(xAxis.getUpperBound()-xAxis.getLowerBound());
double newXlower=xAxis.getLowerBound(),newXupper=xAxis.getUpperBound();
双三角=0.3;
if(mouseEvent.getEventType()==mouseEvent.MOUSE\u拖动){
如果(rectinitX.get()mouseEvent.getX()){
newXlower=xAxis.getLowerBound()+增量;
newXupper=xAxis.getUpperBound()+Delta;
}    
xAxis.setLowerBound(newXlower);
xAxis.setUpperBound(newXupper);
}                                        
rectinitX.set(mouseEvent.getX());
} 
} 
}; 
公共静态void main(字符串[]args){
发射(args);
}
}

一种方法是从开源获取JavaFXUI图表项目的代码;要了解此图表是如何创建的,请创建一个继承(扩展)的图表版本,该版本将完全符合您的要求。您必须重写一些关于重绘的方法,以及一些方法,根据您的领域。您是否考虑过创建一个覆盖绘图区域的矩形,并将其设置为线条的剪辑?嗨,sarcan,这可能是一个尝试的想法,但我认为我的代码@sarcan:按照您的建议,我尝试了这条新线=新线(260,35,390,280);setClip(新矩形(260,35300200));但我要么没有画更多的线,要么在Y轴上仍然有线。非常感谢您的帮助