Search code examples
javadatetimetimerrapidclipse

XDEVTextField's value isn't updated to real time


I have an XDEVTextField that needs to update real time by every second. I tried the answers proposed in this question, including using Executor and Swing Timer. I also tried this way.
Below is my code:

public class FirstView extends XdevView implements Runnable {
    Thread t = null;
    String timeString = "";

    public FirstView() {
        super();
        this.initUI();
        this.t = new Thread(this);
        this.t.start();
    }

    @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                 while (true) {
                    final Calendar cal = Calendar.getInstance();
                    final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
                    final Date date = cal.getTime();
                    this.timeString = formatter.format(date);
                    System.out.println(this.timeString);
                    this.txtTime.setValue(this.timeString);
                    Thread.sleep(500); <-- this should be changed to 1000 but I forgot to
                 } 
              }
              catch (final Exception e) {
                  e.printStackTrace();
              }
        }

The problem is the txtTime's value isn't updated continuously at all, the value was only set once at the point the Thread started
My GUI preview

while the System.out.println(dateandtime.format(date)); can still print out the real time to the console, like this:
The console

I'm using Rapidclipse 3.1.1. I made a similar digital clock like this one using Java Swing's JLabel on Netbeans. I have no clue what can be the problem here. I suspected and checked all the Properties of the txtTime element but nothing seems to be the cause to this. Any suggestion or solution would be appreciated.


Solution

  • you may only access an UI using the access() method, which locks the session to prevent conflicts.

    @Override
        public void run() {
            try {
                while (true) {
                    this.time = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date());
                    System.out.println(this.time);
                    UI.getCurrent().access(()->this.button.setCaption(this.time));
                    this.t.sleep(1000);
                    
                }
            } catch (final InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }