Почему мой ярлык не центрирован вдоль оси y? (Стэнфорд SEE CS106A) - PullRequest
2 голосов
/ 31 марта 2012

Я пытаюсь изучать Java, используя онлайн-курс Стэнфорда CS106A. В курсе используются пакеты библиотеки acm от http://jtf.acm.org/

Может кто-нибудь сказать мне, почему мой код ниже не центрирует метку вдоль оси y?

import acm.program.*;
import acm.graphics.*;

public class CenterLabel extends GraphicsProgram {
    public void run() {
        GLabel text = new GLabel("HELLO!");
        text.setFont("Arial-200");
        double cy = (getHeight() / 2) + (text.getAscent() / 2);
        text.setLocation(0, cy);
        add(text);
    }
}

Когда я запускаю эту программу, я получаю следующее: http://i.imgur.com/rriSX.jpg

Edit: Еще одна вещь, которая меня беспокоит, это то, что пробный прогон в назначении также, похоже, имеет ту же проблему выравнивания. (См. Ссылку ниже, пример 3)

http://see.stanford.edu/materials/icspmcs106a/13-assignment-2-simple-java.pdf

Если вы внимательно посмотрите на изображение, то увидите, что метка внутри поля класса также не отцентрирована должным образом?

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Вы можете использовать метод setBounds для размещения метки там, где вы хотите.Требуется четыре аргумента int.например:

text.setBounds(20,20,20,20);
0 голосов
/ 31 марта 2012

Редактировать: О, дорогой, я неверно указал ваш код, когда тестировал его! Я случайно вычитал два значения, не добавляя их. getAscent() возвращает отрицательное число, представляющее, сколько пикселей над базовой линией поднимается текст, поэтому правильная формула для позиции равна

double cy = (getHeight() / 2) - (text.getAscent() / 2);

Логика та же, но тот факт, что getAscent() отрицателен, означает, что вы должны перевернуть знак. Извините за это!


В CS106A мы обычно не запускаем программы Java как апплеты именно потому, что средство просмотра апплетов по умолчанию получает размеры окна неправильно (то есть, вызов getWidth() или getHeight() приведет к неверным результатам). Если вы загрузите Stanford Eclipse с веб-сайта CS106A, вы получите плагин Eclipse, который может запускать программы Java, которые вы пишете, как автономные приложения. Когда это происходит, размер и форма окна на самом деле правильные, поэтому getWidth() и getHeight() сообщат правильные значения.

В качестве альтернативы рассмотрите возможность добавления следующего кода в свои программы:

public static void main(String[] args) {
    new /* name of your class */.start(args);
}

Затем вы можете запустить программу непосредственно как приложение Java, а не как апплет, и эту проблему следует решить.

Надеюсь, это поможет!

...