2017-01-19 231 views
0

我創建了stroke circel(d = 26)畫布的右中心(300x300) 圖形上下文的默認字體大小爲12pt(不是PIXCEL)。 我想寫上面我創建的圓圈右側一個或兩個數字中心的數字。你可以給我一些數學表達式來寫出該文本正確的圓心。我也不知道如何匹配12點(POINTS)和像素。有人可以幫我嗎?如何在javaFX畫布上繪製一個圓的正中心?

這裏是我的代碼:

@Override 
public void start(Stage primaryStage) { 
    Pane root = new Pane(); 

    Scene scene = new Scene(root, 300, 300); 
    primaryStage.setTitle("My Canvas"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 

    Canvas cvs = new Canvas(); 
    cvs.setWidth(300); 
    cvs.setHeight(300); 
    cvs.setLayoutX(0); 
    cvs.setLayoutY(0); 
    root.getChildren().add(cvs); 
    GraphicsContext gc = cvs.getGraphicsContext2D(); 

    gc.setFill(Color.BLACK); 
    gc.setStroke(Color.BLUE); 
    gc.setLineWidth(2); 

    // creating circle (diameter = 26) right center of the canvas(300 x 300) 
    // So, x = (widthOfCanvas-diameter)/2 , y = ((widthOfCanvas-diameter)/2 
    double d = 26.0d; 
    double x = (cvs.getWidth() - d)/2; 
    double y = (cvs.getHeight() - d)/2; 
    gc.strokeOval(x, y, d, d); 

    // default font size is 12pt (NOT PIXCEL) 
    gc.fillText("26", 150, 150); // How can I set this text right center of the circle? Please give me som mathematical expression 
    // I also don't know relationship betwwen pt and px 
    // What can I do? 
} 
+2

爲什麼不使用'Label'和合適的佈局('StackPane')? –

+1

是的:你真的需要一個畫布嗎?這是一個佈局問題,正如@BoHalim正確指出的那樣,使用佈局可以更好地解決問題。 (實際上,你甚至可以在標籤上使用標籤和一些CSS設置來完成此操作,不需要堆疊窗格和圓圈。)如果*有*使用畫布,則要困難得多。 –

+1

實際上,我正在構建某種繪圖應用程序,我需要找出一種方法來使用上面圈出的數字對圖表中的零件進行編號。但是我沒有把fillText的佈局x,y與我用於圓的x,y變量關聯起來?你有什麼主意嗎? –

回答

0

感謝你們倆!我已經實現你的意見如下!現在我可以在任何地方畫圓圈數字!

@Override 
public void start(Stage primaryStage) { 
     Pane root = new Pane(); 

     Scene scene = new Scene(root, 300, 300); 
     primaryStage.setTitle("My Canvas"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     Canvas cvs = new Canvas(); 
     cvs.setWidth(300); 
     cvs.setHeight(300); 
     cvs.setLayoutX(0); 
     cvs.setLayoutY(0); 
     root.getChildren().add(cvs); 

     GraphicsContext gc = cvs.getGraphicsContext2D(); 
     double x = (cvs.getWidth() - 26)/2; 
     double y = (cvs.getHeight() - 26)/2; 
     gc.drawImage(createCircledNumber(7), x, y); 

     gc.drawImage(createCircledNumber(35), 50, 50); 
     gc.drawImage(createCircledNumber(75), 70, 105); 
    } 

    private WritableImage createCircledNumber(int number) { 
     //createCircledNumber() method always returns 26px X 26px sized image 
     StackPane sPane = new StackPane(); 
     sPane.setPrefSize(26, 26);   

     Circle c = new Circle(26/2.0); 
     c.setStroke(Color.BLACK); 
     c.setFill(Color.WHITE); 
     c.setStrokeWidth(3); 
     sPane.getChildren().add(c); 

     Text txtNum = new Text(number+""); 
     sPane.getChildren().add(txtNum); 
     SnapshotParameters parameters = new SnapshotParameters(); 
     parameters.setFill(Color.TRANSPARENT); 
     return sPane.snapshot(parameters, null); 
    }