Как добавить вторичную легенду в диаграмму JavaFX?

При добавлении настраиваемого узла (в моем случае другая легенда для диаграммы JavaFX) с

val newLegend = MyLegend()
newLegend.isVertical=true

val legend = lookupAll(".chart-legend").first()

Легенды расположены каскадом (неудивительно), но по крайней мере я знаю, что могу их воспроизвести: введите описание изображения здесь

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

legend.getParent().addChildIfPossible( newLegend)

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

Что я делаю неправильно? Могу ли я получить доступ к родительскому контейнеру первой легенды более умным способом?

Полные примеры исходных кодов можно найти на здесь


person Holger Brandl    schedule 16.11.2017    source источник


Ответы (1)


Узел с классом .chart-legend фактически является com.sun.javafx.charts.Legend, который, в свою очередь, расширяет TilePane. Если вы не хотите иметь дело с ограничениями макета TilePane, просто удалите от него дочерние элементы и добавьте в него любой контейнер макета, который вы хотите. В этом примере я добавил VBox и три метки:

with (lookupAll(".chart-legend").first()) {
    getChildList()?.clear()
    vbox {
        label("Line 1")
        label("Line 2")
        label("Line 3")
    }
}

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

person Edvin Syse    schedule 17.11.2017
comment
благодаря. Я бы трижды принимал, если это возможно, на SO, потому что он отлично отвечает на вопрос, решение написано на котлине и даже использует ваш отличный tornadofx api. - person Holger Brandl; 18.11.2017
comment
Рад помочь :) - person Edvin Syse; 19.11.2017