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

您的无限循环可能会阻止标签更新。你需要像 UI 线程这样的东西,它会异步更新它。

于 2014-02-06T08:35:21.573 回答
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 回答