さまざまな提案をいくつか試みても失敗した後、JavaFx Chart(またはそのサブクラス)のデータ系列の表示/非表示を可能にする最良の方法は、そのupdateLegend()メソッドを使用してオーバーライドします。
実際にはとても簡単です。凡例として、チェックボックスを含む凡例として基本HBoxを使用した例を示します。この例では、固定軸タイプ(CategoryAxisとNumberAxis)のLineChartを作成することにしました。サブクラスに軸のジェネリックを残すこともできます。
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);
}
}
私は、たとえば、伝説読みやすくするために、読者のための運動としてそれを残しておきます、各チェックボックスと周りのボーダーのためのチェックボックスにその色を示すものに、一連の色を結合シリーズ。
もう1つのことは、凡例にどの種類のレイアウトコンテナを使用するかを決めるgetLegendSide()メソッドをチェックするとよいでしょう。つまり、TOPとBOTTOMはHBoxですが、LEFTとRIGHTはVBOXです。あなたの選択。
ありがとうございます!それは私が恐れていたものです。 :) – RonSiven
こんにちは@jewelsea、もう1つ質問、あなたが気にしない場合。カスタム凡例を表示するための独自のカスタムペインを作成しました。それはオリジナルとほぼ同じように見えます。私が問題を抱えているのは、ちょうど2つのシリーズがあるときに幅を縮めることです。チャートと凡例はダイアログのVBoxにあり、凡例はVBoxの下部にあるStackPaneにあります。高さは適切に変化する。私に助けてくれる知恵の言葉がもうありますか? – RonSiven
しかし、新しい質問をして、現在のコードを[sscce](http://sscce.org)として追加してください。 – jewelsea