-
Bug
-
Resolution: Unresolved
-
P3
-
jfx11, jfx12
The following code creates a BorderPane that contains in its center a pane. This pane has a border and contains an ImageView whose fitHeight and fitWidth properties are bound to the pane's height and width. If this pane is a TilePane or a BorderPane, the sizes of the pane and image view will grow indefinitely. Pane and BorderPane are not affected. I did not test other panes.
Setting a border is crucial to reproduce this bug.
public class PaneResizeBug extends Application {
@Override
public void start(Stage stage) {
Scene scene = new Scene(new HomeView());
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
public class HomeView extends BorderPane {
HomeView() {
var pane = new AnchorPane(); // AnchorPane or TilePane bugged, Pane or BorderPane not
pane.setBorder(new Border(new BorderStroke(Color.RED, null, null, new BorderWidths(5)))); // necessary for the bug
var imgView = new ImageView();
imgView.fitWidthProperty().bind(pane.widthProperty());
imgView.fitHeightProperty().bind(pane.heightProperty());
imgView.fitWidthProperty().addListener((obs, ov, nv) -> System.out.println("iw " + nv));
imgView.fitHeightProperty().addListener((obs, ov, nv) -> System.out.println("ih " + nv));
pane.widthProperty().addListener((obs, ov, nv) -> System.out.println("w " + nv));
pane.heightProperty().addListener((obs, ov, nv) -> System.out.println("h " + nv));
pane.getChildren().add(imgView);
setCenter(pane);
}
}
The output is:
iw 10.0
w 10.0
ih 10.0
h 10.0
iw 20.0
w 20.0
ih 20.0
h 20.0
iw 120.0
w 120.0
ih 30.0
h 30.0
iw 130.0
w 130.0
ih 40.0
h 40.0
iw 140.0
w 140.0
ih 50.0
h 50.0
iw 150.0
w 150.0
ih 60.0
h 60.0
...
There seems to be some circular call when computing the size of the pane.
Setting a border is crucial to reproduce this bug.
public class PaneResizeBug extends Application {
@Override
public void start(Stage stage) {
Scene scene = new Scene(new HomeView());
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
public class HomeView extends BorderPane {
HomeView() {
var pane = new AnchorPane(); // AnchorPane or TilePane bugged, Pane or BorderPane not
pane.setBorder(new Border(new BorderStroke(Color.RED, null, null, new BorderWidths(5)))); // necessary for the bug
var imgView = new ImageView();
imgView.fitWidthProperty().bind(pane.widthProperty());
imgView.fitHeightProperty().bind(pane.heightProperty());
imgView.fitWidthProperty().addListener((obs, ov, nv) -> System.out.println("iw " + nv));
imgView.fitHeightProperty().addListener((obs, ov, nv) -> System.out.println("ih " + nv));
pane.widthProperty().addListener((obs, ov, nv) -> System.out.println("w " + nv));
pane.heightProperty().addListener((obs, ov, nv) -> System.out.println("h " + nv));
pane.getChildren().add(imgView);
setCenter(pane);
}
}
The output is:
iw 10.0
w 10.0
ih 10.0
h 10.0
iw 20.0
w 20.0
ih 20.0
h 20.0
iw 120.0
w 120.0
ih 30.0
h 30.0
iw 130.0
w 130.0
ih 40.0
h 40.0
iw 140.0
w 140.0
ih 50.0
h 50.0
iw 150.0
w 150.0
ih 60.0
h 60.0
...
There seems to be some circular call when computing the size of the pane.