JavaFX - TabPane не изменяет размер при увеличении высоты содержимого после первого макета - PullRequest
0 голосов
/ 10 октября 2019

У меня есть приложение 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);
    }
}

1 Ответ

0 голосов
/ 10 октября 2019

Взгляните на это, я переместил некоторые вещи, чтобы очистить его, чтобы мне было легче читать и понимать строку, которую вы ищете: titledpane.setOnMouseClicked(event -> tabpane.requestLayout()); Дайте мне знать, если я неправильно понял проблему, я могу обновить ответесли кто-то еще не побьет меня до этого

public class Main extends Application {

    @Override
    public void start(Stage stage) {
        VBox cbox = new VBox();
        cbox.getChildren().addAll(
                new Label("Test ABC"),
                new Label("Test CDE"),
                new Label("Test DEF"),
                new Label("Test EFG")
        );
        TabPane tabpane = new TabPane();

        TitledPane titledpane = new TitledPane("Test collapsible",cbox);
        titledpane.setExpanded(false);
        //The line below should solve the issue
        titledpane.setOnMouseClicked(event -> tabpane.requestLayout());

        VBox box = new VBox();
        box.getChildren().addAll(
                new Label("Test"),
                new Label("Test2"),
                new Label("Test3"),
                titledpane,
                new Label("Test4")
        );

        tabpane.getTabs().addAll(
                new Tab("First tab",box),
                new Tab("Faire Valoir",new Label("Choucroute"))
        );

        box.heightProperty().addListener((arg0, arg1, arg2) -> {
            System.err.println("Height changed "+arg1+" <- "+arg2);
            SingleSelectionModel<Tab> selectionmodel = tabpane.getSelectionModel();//Unused
        });

        ScrollPane scrollPane = new ScrollPane(tabpane);
        stage.setScene(new Scene(scrollPane));
        stage.show();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...