LWUIT 1.4: Почему иногда в этой текстовой области есть дубликаты? - PullRequest
0 голосов
/ 13 декабря 2011

Я создал класс из Dialog, который содержит TextArea:

public class Alert extends Dialog {
    private Container c = new Container(new BorderLayout());
    private Label titre = new Label("Mobile Banking");
    private TextArea chp;
    private Command[] comms;
    public Alert(String text, Command[] comms)
    {
        super();
        titre.setUIID("titre_alert");
        titre.setAlignment(Label.CENTER);
        this.comms = comms;
        setAutoDispose(true);
        for (int cmd=0; cmd<comms.length; cmd++)
            addCommand(comms[cmd]);
        chp = new TextArea();
        chp.setEditable(false);
        chp.setAlignment(Label.CENTER);
        chp.getSelectedStyle().setBorder(null);
        chp.getUnselectedStyle().setBorder(null);
        chp.getSelectedStyle().setBgColor(this.getStyle().getBgColor());
        chp.getUnselectedStyle().setBgColor(this.getStyle().getBgColor());
        if (text.length() % 2 != 0)
            text = " ".concat(text);
        while (text.substring(0, (text.length()/2)+1).length() < chp.getMaxSize()/2)
        {
            text = " ".concat(text);
        }
        chp.setText(text);
        c.addComponent(BorderLayout.NORTH, titre);
        c.addComponent(BorderLayout.CENTER, chp);
    }
    public Command affiche()
    {
        return show(null, c, comms);
    }
}

Внутри формы я запускаю поток, который выполняет вызов HttpConnection и другие задачи.Если задачи завершаются успешно, я вызываю метод affiche() указанного выше класса Alert:

alert = new Alert("Chargement effectué avec succès !", new Command[]{ok});
cntnr.removeComponent(cPatienter); // container displaying the "please wait..."
repaint(); // repainting the Form
if (alert.affiche() == ok) // showing the confirmation of successfullness of the task
{
     alert.dispose();
     controller.displayScreen("Menuprincipale");
}

Проблема заключается в том, что иногда текст, отображаемый при вызове метода affiche(), дублируется:он должен показывать только текст Chargement effectué avec succès !, но иногда он показывает текст, а также Chargement effectué.

Так как сделать так, чтобы только текстовый параметр отображался, но не дублировался?

1 Ответ

2 голосов
/ 15 декабря 2011

Вы вызываете LWUIT в отдельном потоке, что является недопустимым. Вам нужно использовать Display.callSerially, чтобы избежать расы в коде текстового макета. Примерно так:

Display.getInstance().callSerially(new Runnable() {
   public void run() {
       // your LWUIT code here, no need for repaints 
   }
});

Лучшим подходом является использование LWUIT4IO для вашей сети, поскольку он делает это без проблем для вас.

...