使用变量作为x,y参数在Panel中居中

时间:2013-08-31 13:37:00

标签: java swing jpanel paintcomponent

我正试图将圆形图形置于面板中心。

当我使用此代码时,它可以正常工作:

private int radius = 50;
private ballSize = radius * 2;

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawOval(getWidth()/2 - radius, 
        getHeight()/2 - radius, ballSize, ballSize);
}

但是我想使用这个代码(下面),xCoordinate和yCoordinate作为x和y的参数,因为我需要在类中使用其他方法的变量。但是当我使用下面的代码时,圆圈从左上角开始,只有框架中圆圈的左下部分。

private class BallPanel extends JPanel {
    private int radius = 50;
    private int xCoordinate = getWidth() / 2 - radius;
    private int yCoordinate = getHeight() / 2 - radius;
    private int ballSize = radius * 2;

    public void moveUp() {
        if (yCoordinate > 0 - radius) {
            yCoordinate--;
            repaint();
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval(xCoordinate, yCoordinate, 
            radius * 2, radius * 2);
    }
}

为什么在将变量用作参数时会导致此问题,我该怎么做才能解决它?

1 个答案:

答案 0 :(得分:2)

面板的宽度和高度在创建面板的时刻与显示,放大,缩小的时刻之间有所不同。因此,您应始终获得当前宽度和当前高度,就像您在第一个示例中所做的那样,以获得正确的宽度和当前高度。

您不应更改moveUp()中的yCoordinate。您应该更改原始坐标的偏移量:

private int yOffset = 0;
private int ballSize = radius * 2;

public void moveUp() {
    if (computeY() > 0 - radius) {
        yOffset--;
        repaint();
    }
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawOval(getWidth() / 2 - radius, computeY(), ballSize, ballSize);
}

private int computeY() {
    return (getHeight() / 2 - radius) + yOffset;
}