2012-05-18 6 views
1

내가 가진 4 가지 포인터 자바 FX 2 세트 제네릭 클래스

enter image description here

내가 십자 버튼 (오른쪽 최대 하나)를 선택

내가 따를 가지고있는 토글 버튼 그룹 enter image description here

  1. 대부분 하나 개의 버튼을 왼쪽 :이 린없이 간단한 포인터

    각 버튼은 다른 라인 포인터 추종자 호출 이자형;

  2. 두 번째 디스플레이 만 수직선 포인터 이동 링크 됨;
  3. 세 번째 단 하나의 수평 라인 포인터 이동 링크 됨; 십자형 대차.

그리기 루틴에서 호출 할 수 있도록 선택한 선을 설정하는 제네릭 클래스를 만들고 싶습니다.

이 일반/추상 클래스는 해당 버튼을 선택하면 특정 라인 포인터 팔로워 코드를 "포함합니다". 그리기 루틴은 선택 포인터 라인 팔로워를 플롯하기위한 제네릭 클래스 만 나타냅니다.

십자선을 가진 코드는 다음과 같습니다 EventHandler<MouseEvent>의 손에

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

답변

2

모든 도면 라우팅. 십자형을 변경하는 가장 쉬운 방법은 다양한 핸들러를 대체하는 것입니다.

조금 더 자세히 살펴보면 모든 십자선 그림이 유사한 매개 변수를 기반으로하며 시작, 업데이트 및 종료의 3 단계로 나눌 수 있음을 알 수 있습니다.

코드에서 볼 수 있듯이 중요한 매개 변수는 sceneShiftX, sceneShiftY, mouseX, mouseY입니다. MouseEvent.MOUSE_DRAGGED에서 update()에 (완료)하고 MouseEvent.MOUSE_RELEASED에서

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

당신은 start()MouseEvent.MOUSE_PRESSED 블록에서 십자선 관련 코드를 넣어 : 그래서, 당신은 다음 방법과 별도의 클래스에 마우스 이벤트 핸들러의 코드를 그리기 밖으로 리팩토링 할 필요가 .

이제 마우스 이벤트에서 모든 그림 데이터를 분리하고 interface Crosshair을 입력하면 위의 클래스와 비슷하게 보이며 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()); 

      } 

     } 
    }