2

スタンフォード大学のオンライン CS106A コースを使用して Java を学ぼうとしています。このコースでは、 http://jtf.acm.org/の acm ライブラリ パッケージを使用します。

以下の私のコードが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

編集: 私を悩ませているもう1つのことは、割り当てで実行されたサンプルにも同じ配置の問題があるように見えることです。(下のリンク、例 3 を参照)

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

写真をよく見ると、クラスボックス内のラベルもきちんと中央に配置されていないことがわかりますか?

4

2 に答える 2

1

メソッドを使用して、setBounds必要な場所にラベルを配置できます。4 つの int 引数を取ります。例えば:

text.setBounds(20,20,20,20);
于 2012-03-31T18:18:39.753 に答える
0

編集:おっと、テスト中にコードを間違って入力してしまいました! 2 つの値を加算するのではなく、誤って減算していました。 getAscent()テキストがベースラインの上に何ピクセル上にあるかを表す負の数を返すため、位置の正しい式は次のとおりです。

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

ロジックは同じですが、getAscent()負であるということは、符号を反転する必要があることを意味します。ごめんなさい!


CS106A では、通常、Java プログラムをアプレットとして実行することはありません。これは、デフォルトのアプレット ビューアがウィンドウのサイズを正しく取得しないためです (つまり、呼び出すgetWidth()getHeight()、間違った結果を生成します)。CS106A Web サイトからStanford Eclipseをダウンロードすると、作成した Java プログラムをスタンドアロン アプリケーションとして実行できる Eclipse プラグインが得られます。この場合、ウィンドウのサイズと形状は実際には正しいため、getWidth()正しいgetHeight()値が報告されます。

または、次のコードをプログラムに追加することを検討してください。

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

その後、プログラムをアプレットではなく Java アプリケーションとして直接実行することができ、この問題は解決されるはずです。

お役に立てれば!

于 2012-03-31T18:38:37.850 に答える