JFXPanel не изменит размер, чтобы соответствовать FlowPane
Ни один из следующих компонентов не имеет минимальной, максимальной или предпочтительной высоты, если не указано иное: у меня есть JPanel с BorderLayout. В ЦЕНТРЕ BorderLayout есть JPanel. На странице PAGE_START есть панель JFX. JFXPanel был установлен со сценой, содержащей BorderPane, которая, в свою очередь, содержит другую BorderPane (с минимальной, максимальной и предпочтительной высотой, определенной FXML) и FlowPane.
Однако, когда элементы добавляются в FlowPane, JFXPanel не меняет размер. Высота FlowPane остается суммой его верхнего и нижнего отступов - предположительно, так как это правильная высота, когда сцена впервые устанавливается в JFXPanel.
Следовательно, элементы FlowPane обрезаются (или полностью скрываются после переноса). (Если я вручную установлю JFXPanel намного больше, я вижу, что FlowPane корректно изменяет размеры, так что это не проблема.)
Почему моя панель JFX не изменяется? JFXPanels просто не предназначены для изменения размера со своей сценой, или требуется какой-то другой вызов метода (например, invalidate())? Или источником проблемы является один из менеджеров LayoutManager?
MCVE
Следующий код создает кадр, который выглядит следующим образом:
Принимая во внимание, что если я добавлю элементы в FlowPane перед установкой сцены JFXPanel, это будет выглядеть так (что желательно):
Очевидно, что в реальном коде новые элементы добавляются и удаляются из FlowPane по мере продвижения, поэтому мы не можем ждать до тех пор, пока не установим сцену. Хотите, чтобы JFXPanel динамически изменял размеры, как это делает FlowPane.
public static void main(String[] args)
{
JFXPanel topPanel = new JFXPanel();
JPanel centerPanel = new JPanel();
centerPanel.setBorder(BorderFactory.createLineBorder(Color.GREEN));
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(topPanel, BorderLayout.PAGE_START);
mainPanel.add(centerPanel, BorderLayout.CENTER);
JFrame frame = new JFrame("Main Frame");
frame.setContentPane(mainPanel);
frame.setUndecorated(true);
frame.setSize(new Dimension(300, 300));
BorderPane root = new BorderPane();
BorderPane borderPane = new BorderPane();
borderPane.setMinHeight(100);
borderPane.setMaxHeight(100);
borderPane.setStyle("-fx-border-color: red;");
FlowPane flowPane = new FlowPane();
flowPane.setStyle("-fx-border-color: blue;");
root.setCenter(borderPane);
root.setBottom(flowPane);
Platform.runLater(() -> topPanel.setScene(new Scene(root)));
SwingUtilities.invokeLater(() -> frame.setVisible(true));
// Now add some elements to the FlowPane
Platform.runLater(() ->
{
for (int i = 0; i < 5; i++)
{
flowPane.getChildren().add(new PinkSquare());
}
});
}
private static class PinkSquare extends HBox
{
private PinkSquare()
{
super();
setMinHeight(50);
setMinWidth(50);
setStyle("-fx-background-color: pink;");
}
}