2013-03-17 86 views
1

將Graphics2D對象的BasicStroke更改爲除1之外的任何內容會導致它在啓動時不在JPanel的中心繪製某些內容。BasicStroke導致偏離中心

這是在JFrame上的JPanel。這是我的項目的基本想法,但並不是全部。

public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
    if(this.centered){ 
     this.myShape.setCenterX(this.getWidth()/2); 
     this.myShape.setCenterY(this.getHeight()/2); 
    } 
    g2.setStroke(new BasicStroke(3)); //new BasicStroke(1) works fine 
    g2.draw(this.myShape); 
} 

當您單擊並拖動myShape時,myShape將立即跳轉到中心。但是,當我最初編譯並運行它時,如果stroke不是1,那麼paintComponent()會將它繪製在屏幕中心上方約1釐米的位置。

我是如何對錯的?我定義了MyShape類,因此可能會出現錯誤。也許中心和繪圖點之間的距離是JPanel和JFrame頂部之間的距離?我如何解決它?

編輯:在這裏我想它添加圖片

http://s21.postimage.org/dfpmz73et/Untitled_1.png 第一個形狀是正確的。另外兩個在我想要的位置上方。但是無論中風的大小如何,中心的位移都是相同的。

+2

爲更好地提供幫助,請包括[sscce](http://www.sscce.org) – mre 2013-03-17 19:21:01

回答

1

是的,我相信這是一個形狀的正常行爲。它假定一個像素的輪廓。所以當你知道你要改變基本筆劃大小時,你需要改變中心計算。例如:

public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
    BasicStroke stroke = new BasicStroke(3); 
    int adjustment = stroke.getLineWidth() - 1; 

    if(this.centered){ 
     this.myShape.setCenterX(this.getWidth() + adjustment/2); 
     this.myShape.setCenterY(this.getHeight() + adjustment/2); 
    } 
    g2.setStroke(stroke); 
    g2.draw(this.myShape); 
} 
+0

謝謝您的回覆。間距似乎與筆畫大小無關(1除外),並且它比幾個像素大得多。無論我決定放置自己的形狀,它總是在正確座標上方的幾個空格處​​。我有一張照片來解釋我的困境。 – 2013-03-17 21:40:01

+1

圖片不起作用。正如mre所建議的,SSCCE的確如此。 – camickr 2013-03-18 01:09:37