2014-02-06 3 views
0

Я пытаюсь настроить функцию, которая берет входные данные от пользователя и печатает его на этикетке и обновляет ее на запись. Обновление будет происходить путем удаления старой метки, а затем добавления метки с обновленным значением. Текст будет выровнен по центру. Хотя я могу получить ярлык для печати текущего значения «entry», он делает это, не удаляя метку со старым значением. Мне было интересно, как я смогу исправить эту проблему?Функция обновления метки не работает

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

Благодарим за отзыв. Я не уверен, что такое поток, поскольку я следую онлайн-курсу Java, который не охватывал тему в то время, когда я работал над этим. Краткий взгляд на то, что поток пользовательского интерфейса немного смутил меня, и мне интересно, возможно ли, возможно, более простой способ достичь моей цели обновления ярлыка, как описано выше. , поэтому, если я правильно понял, добавление (метка) и удаление (метка) не должны быть инкапсулированы в один и тот же цикл while? Я намеревался сделать цикл бесконечным, чтобы я мог проверить его для различных случаев и для отладки, если бы он не показал ошибку выше –

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 

      } 
     } 
    } 
+0

Еще одна деталь, которую я наблюдал, заключается в том, что вы добавляете каждую новую строку к предыдущему значению входной переменной, проверьте, действительно ли это то, что вы хотите сделать. Вероятно, я бы использовал ссылку << entry = readLine («Дайте мне слово:») >> вместо этого. – Odiseo

Смежные вопросы