JavaFX Auto Resizing Group

У меня есть довольно сложный граф сцены, который привел меня к некоторым проблемам изменения размера. Я был бы рад, если бы вы могли помочь мне решить это.

Мой корневой узел BorderPane что его центр заполнен ListView, Каждая клетка ListView заполнен индивидуальным масштабированием ScrollPane как показано ниже:

public class ZoomableScrollPane extends ScrollPane {

    Group zoomGroup;
    Scale scaleTransform;
    LineChart<Number , Number> content;
    double scaleValue = 1.0;
    double delta = 0.1;

    public ZoomableScrollPane(LineChart<Number , Number> content, double height) {
        this.content = content;
        this.setPrefHeight(height);
        Group contentGroup = new Group();
        zoomGroup = new Group();
        contentGroup.getChildren().add(zoomGroup);
        zoomGroup.getChildren().add(content);
        setContent(contentGroup);
        scaleTransform = new Scale(scaleValue, scaleValue, 0, 0);
        zoomGroup.getTransforms().add(scaleTransform);

    } 
}

Как вы можете видеть, есть LineChart внутри каждого ZoomableScrollPane, Я хочу сделать две вещи с этим графиком. Во-первых, чтобы как-то связать его ширину с корневым макетом, чтобы получить желаемый результат в случае изменения размера окна (не масштабирования, масштабирование в порядке), а во-вторых, изменить ширину диаграммы во время выполнения при каждом нажатии кнопки:

public void handleButton(ActionEvent actionEvent) {
     MainController.lineChart1.setPrefWidth(MainController.lineChart1.getPrefWidth() + CONSTANT);
}

Проблема в том, что здесь я сталкиваюсь с конфликтом. Вызвать LineChart является дочерним элементом группы (не панели), я просто знаю один способ изменения размера, который заключается в том, чтобы связать его ширину вручную с корнем BorderPaneвот так:

MainController.lineChart1.prefWidthProperty().bind(fourChannels.widthProperty().subtract(40));

И в этом случае я не могу изменить LineChartширина во время выполнения и получит A bound value cannot be set Исключение.

Я думаю, что одним из решений может быть пересмотр ZoomableScrollPane Класс, чтобы как-то избежать необходимости ручного связывания, но на самом деле понятия не имею, как это сделать.

Любая помощь по этому вопросу будет принята с благодарностью.

1 ответ

Вы можете определить, связано ли свойство, а затем отменить его, прежде чем манипулировать им:

if (content.prefWidthProperty().isBound()) {
    content.prefWidthProperty().unbind();
}
...

Предположительно, когда вы увеличиваете масштаб на диаграмме и размер окна изменяется, содержимое уже будет больше, чем область просмотра, поэтому принудительное изменение ширины не должно начинаться, пока размер окна не превысит масштаб диаграммы, увеличенный?

Принимая во внимание различные условия, которые у вас есть, вам лучше контролировать размер BorderPane/ListView и, когда это изменится, отрегулировать размер нужных вам диаграмм.

Другие вопросы по тегам