Reputation: 117
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
while the System.out.println(dateandtime.format(date));
can still print out the real time to the console, like this:
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.
Upvotes: 1
Views: 82
Reputation: 48
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();
}
}
Upvotes: 1