1

4 つの異なるポインターを持つトグル ボタン グループがあります。

ここに画像の説明を入力

十字ボタン(一番右のボタン)を選択すると、次のようになります ここに画像の説明を入力

各ボタンは異なるライン ポインター フォロワーを呼び出します。

  1. 左端の 1 つのボタン: 線のない単純なポインターです。
  2. 2 番目の表示は、リンクされた垂直線ポインターの動きのみです。
  3. 3 つ目は、水平線ポインターの動きのみがリンクされています。
  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);  
   } 
  }
4

1 に答える 1

2

すべての図面ルーティングが に渡されEventHandler<MouseEvent>ます。したがって、十字線のタイプを変更する最も簡単な方法は、さまざまなハンドラーを置き換えることです。

もう少し深く掘り下げると、すべての十字線の描画が同様のパラメーターに基づいており、開始、更新、終了の 3 つのステップに分割できることがわかります。

あなたのコードで私が見たところ、重要なパラメータはsceneShiftX, sceneShiftY, mouseX, mouseY. そのため、次のメソッドを使用して、マウス イベント ハンドラーから別のクラスに描画コードをリファクタリングする必要があります。

public class SimpleCrosshair {
    public void start(double mouseX, double mouseY);
    public void update(double sceneShiftX, double sceneShiftY, double mouseX, double mouseY);
    public void finish();
}

十字線関連のコードをMouseEvent.MOUSE_PRESSEDblock からstart()、 fromMouseEvent.MOUSE_RELEASEDから finish() 、および からMouseEvent.MOUSE_DRAGGEDに配置しupdate()ます。

すべての描画データをマウス イベントから分離したので、interface Crosshair上記のクラスと make に似た を導入できSimpleCrosshair implement Crosshairます。

残りは簡単です。Crosshair他のクロスヘア タイプの描画を行う実装クラスを作成private Crosshair currentCrosshair;し、ツールバー ボタンのクリック時に具体的な実装で更新できるフィールドを導入します。

マウス イベント ハンドラーは次のようになります (ズーム ロジックは別として)。

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

            }

        }
    } 
于 2012-05-21T17:25:22.167 に答える