BasicStroke导致偏离中心

时间:2013-03-17 19:18:15

标签: java swing graphics2d

将Graphics2D对象的BasicStroke更改为1以外的任何对象会导致它在启动时不在JPanel的中心绘制某些内容。

这是一个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将立即跳转到中心。但是当我最初编译并运行它时,如果笔划不是1,paintComponent()会将它绘制在屏幕中心上方约1厘米处。

我的中心方式有问题吗?我定义了MyShape类,因此可能存在错误。也许中心和绘图点之间的距离是JPanel和JFrame顶部之间的空间?我该如何解决?

编辑:添加图片

http://s21.postimage.org/dfpmz73et/Untitled_1.png 第一个形状就在我想要的地方。其他两个在我想要的地方之上。但无论行程大小如何,看起来中心位移都是相同的。

1 个答案:

答案 0 :(得分: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);
}