JComponent размер вопроса - PullRequest
       9

JComponent размер вопроса

2 голосов
/ 05 ноября 2011

У меня есть подкласс JComponent, который я использую для рисования фигур на моем экране.В конструкторе я пытаюсь установить для ballX и ballY половину значений X и Y размера JComponent, и я думаю, что делаю этонеправильно.Я много раз искал это сейчас и не могу найти лекарство.Код выглядит следующим образом.Пожалуйста, помните, что это мое первое настоящее предприятие Swing / Graphics2D.

public class PongCanvas extends JComponent {
//Vars to hold XY values and Dimension values.

    private int batXDim, batYDim;
    private int b1X, b1Y;
    private int b2X, b2Y;
    private int ballRad, ballX, ballY;

    public PongCanvas() {//Instantiate vars.
        batXDim = 20;
        batYDim = 100;

        b1X = 0;
        b1Y = 0;

        b2X = 0;
        b2Y = 0;

        ballRad = 20;
        ballX = getWidth() / 2;
        ballY = getHeight() / 2;
    }

    public void paint(Graphics g) {//Main paint Method.
        //Cast Graphics to Graphics2D.
        Graphics2D g2 = (Graphics2D) g;
        //Enable antialiasing.
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        //Draw background.
        g2.setPaint(Color.black);
        g2.fillRect(0, 0, getWidth(), getHeight());
        //Draw ball.
        g2.setPaint(Color.white);
        g2.fillOval(ballX, ballY, ballRad, ballRad);
        //Draw bat 1.
        g2.fillRect(b1X, b1Y, batXDim, batYDim);
        //Draw bat 2.
        g2.fillRect(b2X, b2Y, batXDim, batYDim);
    }
}

Ответы [ 2 ]

5 голосов
/ 05 ноября 2011

Переопределите getPreferredSize() в вашем JComponent, чтобы вернуть желаемый размер, и начните с половины ширины и высоты этого Dimension. С этой же целью это KineticModel вызывает setPreferredSize() в DisplayPanel.

Добавление. В качестве пояснения ваш текущий подход дает сбой, потому что результаты с getWidth() и getHeight() являются недействительными до тех пор, пока validate() не будет вызван во вмещающем контейнере, обычно в результате pack().

2 голосов
/ 05 ноября 2011

Я согласен с ответом trashgod. (+1) * * 1 001

Переместите ballX и ballY в paintComponent(g), как это

if (ballX==0 && ballY==0) {
    ballX = getWidth()/2;
    ballY = getHeight()/2;
}
...