我正在尝试设置一个函数,该函数从用户获取输入并将其打印到标签上并按条目更新。通过删除旧标签然后添加具有更新值的标签来进行更新。文本将是中心对齐的。虽然我能够获得标签来打印“条目”的当前值,但它不会删除带有旧值的标签。我想知道如何纠正这个问题?
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);
}
}
}
答案 0 :(得分:0)
您的无限循环可能会阻止标签更新。你需要像UI线程这样的东西,它会异步更新它。
答案 1 :(得分:0)
在这种情况下,问题与错误的逻辑相对应,因为您更改了标签变量指针上一个删除命令,程序只是没有从画布中删除任何内容,因为标签变量寻址的对象尚未添加到画布中。
在这种情况下,您应首先通过 new 命令删除标签对象表单画布上指针的重定向。您只需记住标签是指向对象的指针。
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
}
}
}