Class JavaFX2为鼠标指针绘图设置通用类

Class JavaFX2为鼠标指针绘图设置通用类,class,draw,abstract,javafx-2,Class,Draw,Abstract,Javafx 2,我有一个带有4个不同指针的切换按钮组 当我选择十字线按钮(最右边的一个)时,我有如下步骤 每个按钮调用不同的线指针跟随器: 最左边的一个按钮:它是一个没有线条的简单指针 二是只显示垂直线指针运动链接 第三只水平线指针移动链接 十字准星 我想创建一个泛型类来设置所选的线,以便在绘图例程中调用它 当选择适当的按钮时,此通用/抽象类“将包含”特定的线指针跟随器代码,这样,绘图例程将仅引用通用类来绘制选择的指针线跟随器 带有十字线的代码是: public class JavaFXApplicatio

我有一个带有4个不同指针的切换按钮组

当我选择十字线按钮(最右边的一个)时,我有如下步骤

每个按钮调用不同的线指针跟随器:

  • 最左边的一个按钮:它是一个没有线条的简单指针
  • 二是只显示垂直线指针运动链接
  • 第三只水平线指针移动链接
  • 十字准星
  • 我想创建一个泛型类来设置所选的线,以便在绘图例程中调用它

    当选择适当的按钮时,此通用/抽象类“将包含”特定的线指针跟随器代码,这样,绘图例程将仅引用通用类来绘制选择的指针线跟随器

    带有十字线的代码是:

    public class JavaFXApplicationMove extends Application { 
    
    Path path; 
    BorderPane pane; 
    Rectangle rect; 
    Line LH;
    Line LV;
    XYChart.Series series1 = new XYChart.Series();     
    
    SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectinitY = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectX = new SimpleDoubleProperty(); 
    SimpleDoubleProperty rectY = new SimpleDoubleProperty(); 
    
    @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);
    yAxis.setAnimated(false);
    
    yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 
    
        @Override 
        public String toString(Number object) { 
            return String.format("%7.5f", object); 
        } 
    }); 
    
    
    //final LineChart<String, Number> lineChart = new LineChart<String, Number> (xAxis, yAxis); 
    final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis); 
    
    lineChart.setCreateSymbols(false); 
    lineChart.setAlternativeRowFillVisible(false); 
    lineChart.setAnimated(true); 
    
    series1.setName("Stock1");
    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);         
    
    path = new Path(); 
    path.setStrokeWidth(5); 
    path.setStroke(Color.RED); 
    
    
    scene.setOnMouseClicked(mouseHandler); 
    scene.setOnMouseDragged(mouseHandler); 
    scene.setOnMouseEntered(mouseHandler); 
    scene.setOnMouseExited(mouseHandler); 
    scene.setOnMouseMoved(mouseHandler); 
    scene.setOnMousePressed(mouseHandler); 
    scene.setOnMouseReleased(mouseHandler); 
    
    
    rect = new Rectangle(); 
    rect.setFill(Color.web("yellow", 0.3)); 
    rect.setStroke(Color.MAGENTA); 
    rect.setStrokeDashOffset(50); 
    rect.widthProperty().bind(rectX.subtract(rectinitX)); 
    rect.heightProperty().bind(rectY.subtract(rectinitY)); 
    pane.getChildren().add(rect); 
    
    //LH=new Line();
    LH=LineBuilder.create()
            .startX(0)
            .startY(0)
            .endX(10)
            .endY(.535)
            .strokeWidth(1)
            .stroke(Color.BLACK)
            .build();
    pane.getChildren().add(LH); 
    
    LV=LineBuilder.create()
            .startX(0)
            .startY(0)
            .endX(10)
            .endY(.535)
            .strokeWidth(1)
            .stroke(Color.BLACK)
            .build();
    pane.getChildren().add(LV);
    
    stage.show(); 
    } 
    
    EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 
    
    @Override 
    public void handle(MouseEvent mouseEvent) { 
    
        if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) { 
            rect.setX(mouseEvent.getX()); 
            rect.setY(mouseEvent.getY()); 
            rectinitX.set(mouseEvent.getX()); 
            rectinitY.set(mouseEvent.getY()); 
            LH.setStartX(0);
            LH.setStartY(0);
            LH.setEndX(0);
            LH.setEndY(0);
    
            LV.setStartX(0);
            LV.setStartY(0);
            LV.setEndX(0);
            LV.setEndY(0);
        } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) { 
            rectX.set(mouseEvent.getX()); 
            rectY.set(mouseEvent.getY()); 
            // Hide the rectangle 
            rectX.set(0); 
            rectY.set(0); 
        } else 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(); 
            System.out.println("(a) xAxis.getLowerBound() "+xAxis.getLowerBound()+" "+xAxis.getUpperBound()); 
            double Tgap = xAxis.getWidth()/(xAxis.getUpperBound() - xAxis.getLowerBound()); 
            double newXlower=xAxis.getLowerBound(), newXupper=xAxis.getUpperBound(); 
            double newYlower=yAxis.getLowerBound(), newYupper=yAxis.getUpperBound(); 
    
            double xAxisShift = getSceneShift(xAxis);
            double yAxisShift = getSceneShift(yAxis);
    
            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){
            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 ); 
    
            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);
    
            }           
    
            //System.out.println("(b) xAxis.getLowerBound() "+xAxis.getLowerBound()+" "+xAxis.getUpperBound()); 
            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()){
            LH.setStartX(xAxisShift);
            LH.setStartY(mouseEvent.getY());
            LH.setEndX(xAxisShift+xAxis.getWidth());
            LH.setEndY(mouseEvent.getY());
    
            LV.setStartX(mouseEvent.getX());
            LV.setStartY(yAxisShift);
            LV.setEndX(mouseEvent.getX());
            LV.setEndY(yAxisShift+yAxis.getHeight());
    
    
            double XX=((mouseEvent.getX() - xAxisShift) / Tgap) + xAxis.getLowerBound();
            double YY=CurrentPrice;
            series1.setName(String.format("%.2g%n",XX) + ", " + String.format("%.4g%n",YY));
    
            int XLB=(int) xAxis.getLowerBound();
            int XUB=(int) xAxis.getUpperBound();
    
            }
    
         } 
        } 
       }; 
    private static double getSceneShift(Node node) { 
    double shift = 0; 
    do {  
        shift += node.getLayoutX();  
        node = node.getParent(); 
    } while (node != null); 
    return shift; 
    }
    
    private static String getHIstLOstY(XYChart.Series S,int XLowerBound,int XUpperBound) { 
    double ValLOst=1000000;
    double ValHIst=-1000000;
    for(int i=XLowerBound; i<XUpperBound; i++){  
        double P=GetPrice(S,i);
        if(ValHIst<P){
            ValHIst=P;
        }
        if(ValLOst>P){
            ValLOst=P;
        }
    }
    return Double.toString(ValLOst) + "," + Double.toString(ValHIst);
    } 
    
    private static double GetPrice(XYChart.Series S,int IX) { 
    Object SVal=S.getData().get(IX);
    //return SVal.toString().toLowerCase(); 
    String Temp=SVal.toString().replaceAll("Data", "");
    Temp=Temp.replace("[", "");
    Temp=Temp.replace("]", "");
    String[] TempArray=Temp.split(",");
    return Double.parseDouble(TempArray[1]);     
    }
    
    
    public static void main(String[] args) { 
        launch(args);  
       } 
      }
    
    公共类JavaFXApplicationMove扩展应用程序{
    路径;
    边框窗格;
    矩形矩形;
    左线;
    线路低压;
    XYChart.Series系列1=新的XYChart.Series();
    SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
    SimpleDoubleProperty rectiny=新的SimpleDoubleProperty();
    SimpleDoubleProperty rectX=新的SimpleDoubleProperty();
    SimpleDoubleProperty rectY=新的SimpleDoubleProperty();
    @凌驾
    公众假期开始(阶段){
    舞台布景标题(“线条图”);
    最终数字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);
    最终线形图线形图=新线形图(xAxis,yAxis);
    lineChart.setCreateSynumbles(false);
    线形图.setAlternativeRowFillVisible(假);
    lineChart.setAnimated(真);
    系列1.集合名称(“股票1”);
    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);
    舞台场景;
    路径=新路径();
    路径设置行程宽度(5);
    路径设定行程(颜色为红色);
    场景。setOnMouseClicked(鼠标手柄);
    场景。SetonMouseDrawed(鼠标手柄);
    场景。setOnMouseEntered(鼠标手柄);
    场景:setOnMouseExited(鼠标手柄);
    场景:setOnMouseMoved(鼠标手柄);
    场景。设置鼠标按下(鼠标手柄);
    场景。setOnMouseReleased(鼠标手柄);
    rect=新矩形();
    矩形设置填充(颜色web(“黄色”,0.3));
    直行程(颜色为洋红色);
    直接设定行程偏移量(50);
    widthProperty()绑定(rectX.subtract(rectinitX));
    rect.heightProperty().bind(rectY.subtract(rectinitY));
    pane.getChildren().add(rect);
    //LH=新行();
    LH=LineBuilder.create()
    .startX(0)
    .斯塔蒂(0)
    .endX(10)
    .endY(.535)
    .冲程宽度(1)
    .笔划(颜色.黑色)
    .build();
    pane.getChildren().add(左侧);
    LV=LineBuilder.create()
    .startX(0)
    .斯塔蒂(0)
    .endX(10)
    .endY(.535)
    .冲程宽度(1)
    .笔划(颜色.黑色)
    .build();
    pane.getChildren().add(LV);
    stage.show();
    } 
    EventHandler mouseHandler=新的EventHandler(){
    @凌驾
    公共无效句柄(MouseEvent MouseEvent){
    如果(mouseEvent.getEventType()==mouseEvent.MOUSE_按下){
    setX(mouseEvent.getX());
    setY(mouseEvent.getY());
    rectinitX.set(mouseEvent.getX());
    set(mouseEvent.getY());
    LH.setStartX(0);
    LH.setStartY(0);
    LH.setEndX(0);
    LH.setEndY(0);
    LV.setStartX(0);
    LV.setStartY(0);
    LV.setEndX(0);
    塞滕迪低压(0);
    }else如果(mouseEvent.getEventType()==mouseEvent.MOUSE_已释放){
    set(mouseEvent.getX());
    set(mouseEvent.getY());
    //隐藏矩形
    rectX.set(0);
    矩形集(0);
    }如果(mouseEvent.getEventType()==mouseEvent.MOUSE_拖动| | mouseEvent.getEventType()==mouseEvent.MOUSE_移动){
    折线图折线图=(折线图)窗格。getCenter();
    NumberAxis yAxis=(NumberAxis)lineChart.getYAxis();
    NumberAxis xAxis=(NumberAxis)lineChart.getXAxis();
    System.out.println(“(a)xAxis.getLowerBound()”+xAxis.getLowerBound()+”+xAxis.getUpperBound());
    双Tgap=xAxis.getWidth()/(xAxis.getUpperBound()-xAxis.getLowerBound());
    double newXlower=xAxis.getLowerBound(),newXupper=xAxis.getUpperBound();
    double newYlower=yAxis.getLowerBond(),newYupper=yAxis.getUpperBound();
    双xAxisShift=getSceneShift(xAxis);
    双yAxisShift=getSceneShift(yAxis);
    double yaxistep=yAxis.getHeight()/(yAxis.getUpperBound()-yAxis.getLowerBound());
    double CurrentPrice=yAxis.getUpperBound()-((mouseEvent.getY()-yAxisShift)/yAxisStep);
    双三角=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);
    如果(re)
    
    public class SimpleCrosshair {
        public void start(double mouseX, double mouseY);
        public void update(double sceneShiftX, double sceneShiftY, double mouseX, double mouseY);
        public void finish();
    }
    
        EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
    
                if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
                    currentCrosshair.start(mouseEvent.getX(), mouseEvent.getY());
                } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
                    currentCrosshair.finish();
                } else 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 xAxisShift = getSceneShift(xAxis);
                    double yAxisShift = getSceneShift(yAxis);
                    currentCrosshair.update(xAxisShift, yAxisShift, mouseEvent.getX(), mouseEvent.getY());
    
                }
    
            }
        }