После нескольких неудачных попыток реализации различных предложений я обнаружил, что лучший способ разрешить пользователю показывать/скрывать серию данных в диаграмме JavaFx (или подклассах) - это расширить класс диаграммы, который вы хотите использовать и переопределить его метод updateLegend().
На самом деле это довольно просто. Вот пример использования базового HBox в качестве легенды, содержащей флажки в качестве элементов легенды. В этом примере я решил сделать свой LineChart с фиксированными типами осей (CategoryAxis и NumberAxis). Вы можете оставить свой подкласс с дженериками для осей.
public class AtopLineChart<X, Y> extends LineChart<String, Number>
{
/**
* @param xAxis
* @param yAxis
*/
public AtopLineChart(final CategoryAxis xAxis, final NumberAxis yAxis)
{
super(xAxis, yAxis);
}
/* (non-Javadoc)
* @see javafx.scene.chart.LineChart#updateLegend()
*/
@Override
protected void updateLegend()
{
final HBox legend = new HBox();
legend.setVisible(true);
for (final javafx.scene.chart.XYChart.Series<String, Number> series : getData())
{
final CheckBox cb = new CheckBox(series.getName());
cb.setUserData(series);
cb.setSelected(true);
cb.addEventHandler(ActionEvent.ACTION, e ->
{
final CheckBox box = (CheckBox) e.getSource();
@SuppressWarnings("unchecked")
final Series<String, Number> s = (Series<String, Number>) box.getUserData();
s.getNode().setVisible(box.isSelected());
});
legend.getChildren().add(cb);
}
setLegend(legend);
}
}
Я оставлю его в качестве упражнения для читателя, чтобы сделать легенду более читаемым, например, границы вокруг каждого флажка и переплета цвет серии на то, чтобы показать, что цвет в окошке для серии.
Еще одна вещь, вы можете проверить метод getLegendSide(), чтобы решить, какой вид контейнера макета использовать для легенды, т. Е. HBox для TOP и BOTTOM, но VBOX для LEFT и RIGHT. Твой выбор.
Спасибо! Вот чего я боялся. :) – RonSiven
Эй, @jewelsea, Еще один вопрос, если вы не возражаете. Я создал свою собственную панель для отображения моей пользовательской легенды. Он выглядит почти так же, как оригинал. Единственное, с чем я столкнулся, это уменьшить ее ширину, когда есть всего несколько серий. Диаграмма и легенда находятся в VBox в диалоговом окне, а легенда - в StackPane в нижней части VBox.Высота изменяется соответствующим образом. Есть ли у вас больше слов мудрости, которые могут помочь мне? – RonSiven
Да, но задайте новый вопрос и включите в него текущий код в качестве [sscce] (http://sscce.org). – jewelsea