2013-03-17 52 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