some ugly thing with timers
Well, that actually is the Java way to do it. You would create another thread that loops. It always sleeps for a certain interval and then does whatever timed action you want. Abusing validation and painting for this is not even nice in C#.
That's why I keep ranting about the "main loop".
In a usual SFML application, you have a "main loop" that does all the input handling, timed updates, rendering, etc while the window is open. There is absolutely no reason to not do it the same way with a render canvas. You just create the frame, add the canvas, make it visible and enter your main loop. You don't have to create another thread, AWT runs in its own thread by default.
The only thing that you need to synchronize into that main loop would be AWT input, e.g. when the user presses a button. AWT event listeners are always called in the AWT thread. I'm not sure what else you would like to synchronize between threads.