2012-09-27 37 views
5

私はJavaFXラインチャートのスタイルを設定しようとしていますが、凡例に問題があります。JavaFX 2.0 - LineChartの凡例の色を動的に変更する方法は?

私は、CSSファイルで折れ線グラフの凡例の色を変更する方法を知っている:

.default-color0.chart-series-line { -fx-stroke: #FF0000, white; }
.default-color1.chart-series-line { -fx-stroke: #00FF00, white; }
.default-color2.chart-series-line { -fx-stroke: #0000FF, white; }

.default-color0.chart-line-symbol { -fx-background-color: #FF0000, white; }
.default-color1.chart-line-symbol { -fx-background-color: #00FF00, white; }
.default-color2.chart-line-symbol { -fx-background-color: #0000FF, white; }

しかし、これは私の目的のために十分ではありません。 3つ以上のカラートグルボタンと各ボタンの一連のデータがあります。データは、ボタンを選択した後、ボタンと同じ色で表示する必要があります。これは、複数のデータ系列を同時に表示できるように、ボタンの複数選択で可能でなければなりません。

..
dataList.add(series);
..
series.getNode().setStyle("-fx-stroke: rgba(" + rgba + ")");

私は、リストからデータを削除するボタンを選択解除する場合:私はボタンをクリックした後、私はスタイルを変更することで、それを管理しているグラフの線の場合

dataList.remove(series);

ストロークのために正常に動作しているが、どのように私は伝説のために同じことを行うことができますか?

以下に例を示します。最初に赤いボタンをクリックしたので、ストロークと凡例は赤色になります(default-color0)。その後、私は青いボタンをクリックした。ここで問題を見ることができます。ストロークは青ですが、凡例は緑です。デフォルトのcolor1が使用されているため、凡例の色を変更する方法はわかりません。

enter image description here

+0

字幕またはラベルを意味しますか? – ceklock

答えて

0

this男はそれらのノード上でsetStyle()を呼び出した後、自分のクラスを使用して、そして伝説のために使用されたノードを検索することが可能であると思われます。 (彼の問題はあなたのものとは関係ないと思う)

2

私もこの問題に遭遇しました。この問題は、データ系列がグラフに追加されたときに凡例が同時に更新されないため、その系列Nスタイルクラスのコンポーネントを参照するときにまだ存在しないことが原因と考えられます。凡例アイテムが作成されたときにそれを検出して、ダイナミックなスタイリングを追加できるようにする回避策を思いついた。

グラフの凡例の "getChildrenUnmodifiable()" ObservableListにListChangeListenerを追加し、ListChangeListenerが追加されたときに凡例の各子にListChangeListenerを追加します。このリスナー内から、新しい項目が凡例に追加される(または削除された)時点を確認できます。これにより、動的なスタイルの変更を行うことができます。今後の参考のために

for (Node n : lineChart.getChildrenUnmodifiable()) 
    { 
     if (n instanceof Legend) 
     { 
      final Legend legend = (Legend) n; 

      // remove the legend 
      legend.getChildrenUnmodifiable().addListener(new ListChangeListener<Object>() 
      { 
       @Override 
       public void onChanged(Change<?> arg0) 
       { 
        for (Node node : legend.getChildrenUnmodifiable()) 
        { 
         if (node instanceof Label) 
         { 
          final Label label = (Label) node; 
          label.getChildrenUnmodifiable().addListener(new ListChangeListener<Object>() 
          { 
           @Override 
           public void onChanged(Change<?> arg0) 
           { 
            //make style changes here 
           } 

          }); 
         } 
        } 
       } 
      }); 
     } 
    } 
+1

これは何千ものありがとう、私は何かのようなものを探していた。 – MaxD

+0

私はスタイルの変更を追加するつもりはないかもしれないが、ちょっと愚かな質問ですか?ラベルを付ける? @MaxD –

1

、この問題はPlatform.runLater()への呼び出しであなたの関連するコードをラップすることによって解決することができます。例:

LineChart<Number, Number> plot; 
.... 
Platform.runLater(() -> { 
    Node nl = plot.lookup(".default-color0.chart-series-line"); 
    Node ns = plot.lookup(".default-color0.chart-line-symbol"); 

    nl.setStyle("-fx-stroke: #333;"); 
    ns.setStyle("-fx-background-color: #333, white;"); 
}); 
+0

ありがとうございました! JavaFXのこれらの謎めいたCSSをどこで見つけることができますか? –

+1

@ Zeta.Investigatorこれは私がリファレンスとして使用しているものです。https://gist.github.com/tmazeika/c90c03c645d18722ddb0 – Chris

+0

このplot.lookupは何ですか? –

関連する問題