To demonstrate the topics covered in this chapter, I have written a small clock application.
It will become more complex with each upcoming chapter; for the first release it just shows a current local time in text form and updates it every second, demonstrating Stage/Scene usage, one of the layout managers, and the Application FX Thread workflow:
See the inline comments for details about the program:
// chapter1/clock/ClockOne.java public class ClockOne extends Application { // we are allowed to create UI objects on non-UI thread private final Text txtTime = new Text();
private volatile boolean enough = false;
// this is timer thread which will update out time view every second Thread timer = new Thread(() -> { SimpleDateFormat dt = new SimpleDateFormat("hh:mm:ss"); while(!enough) { try { // running "long" operation not on UI thread Thread.sleep(1000); } catch (InterruptedException ex) {} final String time = dt.format(new Date()); Platform.runLater(()-> { // updating live UI object requires JavaFX App Thread txtTime.setText(time); }); } });
@Override public void start(Stage stage) { // Layout Manager BorderPane root = new BorderPane(); root.setCenter(txtTime);
// creating a scene and configuring the stage Scene scene = new Scene(root, 200, 150); stage.initStyle(StageStyle.UTILITY); stage.setScene(scene);
timer.start(); stage.show(); }
// stop() method of the Application API @Override public void stop() { // we need to stop our working thread after closing a window // or our program will not exit enough = true; }
public static void main(String[] args) { launch(args); } }