0

ユーザーからの入力を取得してラベルに印刷し、エントリごとに更新する関数をセットアップしようとしています。更新は、古いラベルを削除してから、更新された値でラベルを追加することによって行われます。テキストは中央揃えになります。「エントリ」の現在の値を印刷するラベルを取得することはできますが、古い値のラベルを削除せずに印刷します。どうすればこの問題を修正できるのだろうかと思っていました。

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

public class testCanvas extends ConsoleProgram {

    public void run()
    {
        GCanvas canvas = new GCanvas();
        add(canvas);
        String entry ="";
        while(true)
        {

            entry += readLine("Give me a word: ");
            if(entry=="") break;
            GLabel label = new GLabel(entry);
            label.setLocation(200-label.getWidth()/2, 
                    60+label.getHeight());

            label.setFont("Times New Roman-24");
            // remove old label and immediately update it with 
            // label with current value for "entry"
            canvas.remove(label);
            canvas.add(label);

        }
    }
}
4

2 に答える 2

0

この場合、問題は誤ったロジックに対応しています。ラベル変数ポインターの前の削除コマンドを変更したため、ラベル変数によってアドレス指定されたオブジェクトがキャンバスに追加されていないため、プログラムはキャンバスから削除するものが何もありません。

この場合、最初に新しいコマンドによるポインタのリダイレクト先のラベル オブジェクト フォーム キャンバスを削除する必要があります。ラベルはオブジェクトへのポインターであることを覚えておいてください。

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

    public class testCanvas extends ConsoleProgram {

        public void run()
        {
            GCanvas canvas = new GCanvas();
            add(canvas);
            String entry ="";
            GLabel label = null;
            while(true) {

                entry += readLine("Give me a word: ");
                if(entry=="") break;

                if (label!=null) canvas.remove(label);  //removes the previous label object
                label = new GLabel(entry);  //redirect the pointer to the new object
                label.setLocation(200-label.getWidth()/2, 
                        60+label.getHeight());

                label.setFont("Times New Roman-24");
                canvas.add(label);  //adds the new label to the canvas

            }
        }
    }
于 2014-06-15T06:35:28.457 に答える
0

無限ループにより、ラベルの更新が妨げられている可能性があります。非同期で更新する UI スレッドのようなものが必要です。

于 2014-02-06T08:35:21.573 に答える