2016-12-08 2 views
0

У меня довольно сложный график сцены, который привел меня к некоторым проблемам с изменением размера. Я был бы рад, если бы вы помогли мне решить эту проблему.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 «s, как это:

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

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

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

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

+0

Дубликат: [правильное масштабирование JavaFX] (http://stackoverflow.com/questions/16680295/javafx-correct-scaling)? – jewelsea

+0

@jewelsea Речь идет не о масштабировании. Просто не знаю, как иметь группу автоматического изменения размера или как увеличить ширину привязки во время выполнения. –

ответ

0

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

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

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

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

Смежные вопросы