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 и, когда это изменится, отрегулировать размер нужных вам диаграмм.