Probably bug: UI changes made while minimized, not reflected upon restore/maximize

Andy Goryachev andy.goryachev at oracle.com
Wed Mar 12 14:54:22 UTC 2025


Reproduced, thanks!  I am going to create a bug shortly.

-andy

From: openjfx-dev <openjfx-dev-retn at openjdk.org> on behalf of John Hendrikx <john.hendrikx at gmail.com>
Date: Wednesday, March 12, 2025 at 07:52
To: openjfx-dev at openjdk.org <openjfx-dev at openjdk.org>
Subject: Re: Probably bug: UI changes made while minimized, not reflected upon restore/maximize

Here's a simpler version that shows the problem. It appears that a stage in iconified mode (minimized) is simply not doing any updates when it becomes visible again. In my system, when I click the task bar to show the stage, I just see an empty box (with a color that is clearly not the correct background color). A resize will show the label, and the background color changes to the correct one:

public class App extends Application {

public static void main(String[] args) {

Application.launch(args);

}

@Override

public void start(Stage stage) {

Scene scene = new Scene(new Label("This should be modified when the signal is received"), 500, 500);

stage.setScene(scene);

stage.setIconified(true);

stage.show();

}

}

--John
On 12/03/2025 02:36, Cormac Redmond wrote:
That meant to say: the act of simply maximising the window ***doesn't*** seem to trigger a redraw.


On Wed, 12 Mar 2025 at 00:19, Cormac Redmond <credmond at certak.com<mailto:credmond at certak.com>> wrote:
Hi all,

A user reported this on reddit: https://www.reddit.com/r/JavaFX/comments/1j8ibpf/platformrunlater_not_updating_the_content_when/

I do feel this is a bug so I'm raising it here. Windows 11, JFX 23.0.2.

A quick summary is: if you change a Label while your app is minimized, for example, the change does not get reflected when restored/maximised, unless _something else_ triggers a redraw, such as a window resize, or a hover over a button, etc.

The act of simply maximising the window does seem to trigger a redraw. I think it should.

Here are two fairly self-explanatory Java classes to demonstrate the problem (adapted from the reddit post).

Steps:

- Run MinimizeBugApp, observe label
- Run Client, hit enter and observe label change as expected
- Minimize app, and hit enter on Client one or more times (all triggering label changes)
- Restore app, note Label incorrectly still *displays* the same value as before the minimize, despite update(s)
- Re-size window to force a redraw, observe correct label value appears


public class MinimizeBugApp extends Application {

    public void start(Stage stage) {
        Label label = new Label("This should be modified when the signal is received");

        StackPane stackPane = new StackPane();
        stackPane.getChildren().add(label);
        Scene scene = new Scene(stackPane, 500, 500);
        stage.setScene(scene);
        stage.show();

        new Thread(() -> {
            this.startServer(label);
        }).start();
    }

    void startServer(final Label label) {
        try (ServerSocket serverSocket = new ServerSocket(1590)) {
            while (true) {
                System.out.println("Waiting for connection...");
                serverSocket.accept();
                Platform.runLater(() -> {
                    System.out.println("Setting signal is received...");
                    label.setText("The signal is received " + new Date());

                    // This will print the correct text, always -- but the texted isn't what is reflected if
                    // it's minimized and then maximized
                    System.out.println("Label text should be: " + label.getText());
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch();
    }
}


// Simple test to trigger something in a JavaFX app via a socket
public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            try {
                System.out.print("Hit enter to create connection");
                scanner.nextLine();
                new Socket("localhost", 1590);
                System.out.println("Created connection");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


Any thoughts? Is this by design for some reason, or a bug?



Kind Regards,

Cormac Redmond
Software Engineer, Certak Ltd.

e: credmond at certak.com<mailto:credmond at certak.com> | m: +353 (0) 86 268 2152 | w: www.certak.com<http://www.certak.com>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20250312/d9401167/attachment-0001.htm>


More information about the openjfx-dev mailing list