So on Windows at least, it will change the width temporarily and then
revert back to the original width value. So you will receive two width
change events if you listen to the stage width property. The maximized
property is not changed.
I guess this also not optimal handling of this. Ideally, no changes
would be made in that case.
On 17/03/2025 10:53, Thiago Milczarek Sayão wrote:
Hi Christopher,
It seems like a simple fix.
How does it behave on other platforms? Does it ignore the resize,
restore the window to its unmaximized state before resizing, or keep
it maximized while adjusting the unmaximized size.
-- Thiago
Em dom., 16 de mar. de 2025 às 05:25, Christopher Schnick
<crschn...@xpipe.io> escreveu:
Hello,
we encountered an issue on Linux where resizing the stage while it
is maximized breaks the size of the scene. You can see a video of
this at https://github.com/xpipe-io/xpipe/issues/485 . The root
cause is that the stage size is modified.
When doing this, it temporarily or permanently switches to the
size the stage had prior to being maximized, leading to either a
flicker or a permanently broken scene that has the wrong size.
This happens on Gnome and KDE for me with the latest JavaFX ea
version.
Here is a simple reproducer:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import java.io.IOException;
import java.util.Base64;
public class MaximizeLinuxBugextends Application {
@Override public void start(Stage stage)throws IOException {
Scene scene =new Scene(createContent(),640,480);
var s ="data:text/css;base64," +
Base64.getEncoder().encodeToString(createCss().getBytes());
scene.getStylesheets().add(s);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
stage.centerOnScreen();
stage.setMaximized(true);
}
private StringcreateCss() {
return """ * { -fx-border-color: red; -fx-border-width: 1; } """;
}
private RegioncreateContent() {
var button =new Button("Click me!");
button.setOnAction(event -> {
var w =button.getScene().getWindow();
w.setWidth(w.getWidth() -1);
event.consume();
});
var stack =new StackPane(button);
return stack;
}
public static void main(String[] args) {
launch();
}
}
Best
Christopher Schnick