Назначение переменной и затем использование переменной в параметрах? - PullRequest
0 голосов
/ 18 февраля 2010

Я занимаюсь этими бесплатными онлайн-уроками Стэнфорда и изучаю Java. Я застрял на чем-то и не смог понять это. Я думаю, что должно быть что-то не так с моей логикой. Пожалуйста, проверьте код ниже. Я прокомментировал это, так что, надеюсь, вы сможете понять, что я пытаюсь сделать там.

import acm.graphics.*;
import acm.program.*;
import java.awt.*;

public class Pyramid extends GraphicsProgram {

/** Width of each brick in pixels */
    private static final int BRICK_WIDTH = 30;

/*  Width of each brick in pixels */
    private static final int BRICK_HEIGHT = 12;

/** Number of bricks in the base of the pyramid */
    private static final int BRICKS_IN_BASE = 14;

/** The Width of the Base in px  */ 
    double baseInPx = BRICKS_IN_BASE * BRICK_WIDTH;

/** Taking the width of the window minus the width of the base and dividing by two 
 * to find the x axis starting point)   
 */
    double firstBrick = (getWidth() - baseInPx) / 2;

/* giving the y axis a variable name  */
        double baseHeight = getHeight();

    public void run() {

        add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));

    }   

}

Я думаю, что, должно быть, что-то не так в моем форматировании в этой строке:

double firstBrick = (getWidth() - baseInPx) / 2;

Проблема в том, что моя переменная по оси x не работает. Если я жестко закодирую число там, появится прямоугольник, но не с firstBrick

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: Спасибо всем за вашу помощь! Практически каждый из вас был прав. Я только что чему-то научился!

Ответы [ 6 ]

2 голосов
/ 18 февраля 2010

Переместите firstBrick и baseHeight в метод run и посмотрите, работает ли он.

public void run() {
    double firstBrick = (getWidth() - baseInPx) / 2;
    double baseHeight = getHeight();

    add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));

}

Я предполагаю, что ваши getWidth () и getHeight () являются методами экземпляра, а не статическими. Поэтому вы не можете вызывать их в своем блоке инициализации объекта (в вашем примере кода: inits вне любых методов), потому что объект Pyramid не был полностью инициализирован.

Вы также можете объявить переменные там, где они есть, и инициализировать их в конструкторе Pyramid, который является предпочтительным подходом. Вот для чего нужны конструкторы.

2 голосов
/ 18 февраля 2010

Я постараюсь помочь вам помочь себе. Попробуйте перевести вычисление в метод run и распечатать значение, чтобы увидеть, как оно отличается от того, что вы ожидаете, если жестко закодировать значение.

0 голосов
/ 18 февраля 2010

Ответ находится внизу этой ссылки , если она вам действительно нужна. Вы на правильном пути, но конкретная линия, о которой вы говорите, верна.

0 голосов
/ 18 февраля 2010

Ваша проблема в этой строке:

double firstBrick = (getWidth () - baseInPx) / 2;

В тот момент, когда эта строка выполняется, getWidth () возвращает 0; Результатом операции является отрицательное число, которое не будет окрашено.

Как уже говорилось, вы должны вызывать функцию после создания пользовательского интерфейса. -> run ()

0 голосов
/ 18 февраля 2010

Попробуйте установить firstBrick и baseHeight в методе run или, возможно, в конструкторе.

import acm.graphics.*;
import acm.program.*;
import java.awt.*;

public class Pyramid extends GraphicsProgram {

    private static final int BRICK_WIDTH = 30;
    private static final int BRICK_HEIGHT = 12;
    private static final int BRICKS_IN_BASE = 14;
    double baseInPx = BRICKS_IN_BASE * BRICK_WIDTH;

    double firstBrick;
    double baseHeight;

    public void run() {
       firstBrick = (getWidth() - baseInPx) / 2;
       baseHeight = getHeight();

       add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));

    }   

}
0 голосов
/ 18 февраля 2010

Посмотрите на этот код

public class Assignment {

    private String a = setString();
    private String b;

    public Assignment() {
        b = "set in constructor";
    }

    private String setString() {
        return b;
    }

    private String getA() {
        return a;
    }

    public static void main(String[] args) {
        System.out.println(new Assignment().getA());
    }

}

Это напечатает ноль;

Я предполагаю, что происходит нечто подобное. Возможно, ширина и высота пирамиды установлены во время конструктора, поэтому при вызове getWidth и getHeight по умолчанию устанавливаются в 0.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...