У меня есть приложение javafx, которое отображает контент внутри полосы прокрутки. Этот контент включает в себя TabPane. Внутри вкладки есть VBox, содержащий виджеты, которые могут изменять высоту в зависимости от взаимодействия с пользователем, особенно:
- табличное представление, в котором отображается больше строк
- Раскрытая TitledPane.
Когда это происходит, приложение не изменяет размер, как ожидалось. Я понимаю, что проблема в том, что панель не раскрывается в соответствии с ее расширенным содержимым.
Однако макет будет корректно обновляться, если я изменю размер окна приложения или просто выберу другую вкладку, а затем вернусь на исходную вкладку.
Так что я считаю, что отсутствует только запуск"некоторые переделать. Однако я не смог управлять им, вызвав requestLayout при изменении размера вкладки. Я попытался принудительно настроить вкладку minHeight и maxHeight, затем изменилось и содержимое вкладки, но это не работает.
См. Ниже пример программы, которая показывает проблему (это javafx 8, но я считаю, что проблема нес тех пор исправлено)
import javafx.application.Application;
import javafx.beans.property.ReadOnlyDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.stage.Stage;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.SingleSelectionModel;
import javafx.scene.layout.VBox;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TitledPane;
import javafx.scene.control.TabPane;
import javafx.scene.control.Tab;
public class TitledPaneBench extends Application {
@Override
public void start(Stage stage) throws Exception {
ScrollPane pane = new ScrollPane();
VBox box = new VBox();
box.getChildren().add(new Label("Test"));
box.getChildren().add(new Label("Test2"));
box.getChildren().add(new Label("Test3"));
VBox cbox = new VBox();
cbox.getChildren().add(new Label("Test ABC"));
cbox.getChildren().add(new Label("Test CDE"));
cbox.getChildren().add(new Label("Test DEF"));
cbox.getChildren().add(new Label("Test EFG"));
TitledPane titledpane = new TitledPane("Test collapsible",cbox);
titledpane.setExpanded(false);
box.getChildren().add(titledpane);
box.getChildren().add(new Label("Test4"));
TabPane tabpane = new TabPane();
Tab tab1 = new Tab();
tab1.setText("First tab");
tab1.setContent(box);
Tab tab2 = new Tab();
tab2.setText("Faire Valoir");
tab2.setContent(new Label("Choucroute"));
tabpane.getTabs().add(tab1);
tabpane.getTabs().add(tab2);
box.heightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
System.err.println("Height changed "+arg1+" <- "+arg2);
SingleSelectionModel<Tab> selectionmodel = tabpane.getSelectionModel();
box.requestLayout();
tabpane.requestLayout();
}
});
pane.setContent(tabpane);
stage.setScene(new Scene(pane));
stage.show();
}
public static void main(String args[]) {
TitledPaneBench tb = new TitledPaneBench();
tb.launch(args);
}
}