2017-06-05 100 views
0

我試圖動態設置BarChartSeries顏色。JavaFX BarChart,按系列名稱設置系列顏色

我想要爲同一系列名稱始終使用相同的顏色。 它在圖表中並不總是相同的系列名稱,這就是爲什麼我不能依賴圖表中的位置(每個默認顏色在數據列表中的相同位置始終相同)。

chart.getData().addListener(new ListChangeListener<Series<String, Number>>() { 

     @Override 
     public void onChanged(
      final javafx.collections.ListChangeListener.Change<? extends Series<String, Number>> c) { 
     while (c.next()) { 
      for (final Series s : c.getAddedSubList()) { 
      if ("booking".equalsIgnoreCase(s.getName())) { 
       if (s.getNode() != null) { 
       s.getNode().getStyleClass().add(".source-background-booking"); 
       } 
      } else if ("airbnb".equalsIgnoreCase(s.getName())) { 
       if (s.getNode() != null) { 
       s.getNode().getStyleClass().add(".source-background-airbnb"); 
       } 
      } 
      } 
     } 
     } 
    }); 

這不起作用。 SeriesNode總是null。這是爲什麼?

編輯:不工作的另一種方法:

chart.getData().addListener(new ListChangeListener<Series<String, Number>>() { 

     @Override 
     public void onChanged(
      final javafx.collections.ListChangeListener.Change<? extends Series<String, Number>> c) { 
     while (c.next()) { 
      System.err.println("Series " + c.getAddedSubList() + " kommt rein.."); 
      for (final Series<String, Number> s : c.getAddedSubList()) { 
      s.nodeProperty().addListener(new ChangeListener<Node>() { 

       @Override 
       public void changed(final ObservableValue<? extends Node> observable, final Node oldValue, 
        final Node newValue) { 
       System.err.println("Already good"); 
       if ("booking".equalsIgnoreCase(s.getName())) { 
        newValue.getStyleClass().add(".source-background-booking"); 
        System.err.println("Seems to work.."); 
       } else if ("airbnb".equalsIgnoreCase(s.getName())) { 
        newValue.getStyleClass().add(".source-background-airbnb"); 
        System.err.println("Seems to work.."); 
       } 
       } 
      }); 

      } 
     } 
     } 
    }); 

不幸的是,這個回調似乎從來沒有所謂的..

+0

你應該做一些類似於[this](https://stackoverflow.com/questions/15233858/how-to-change-color-of-a-single-bar-java-fx)或[this] (https://stackoverflow.com/questions/14158104/javafx-barchart-color)。 – Sedrick

+0

感謝塞德里克,看到編輯(第一個建議),第二個不起作用,因爲不同系列並不總是在同一個位置,這就是爲什麼默認顏色('.default-color0.chart-bar {-fx-bar-填充:*****}')不起作用。 – kerner1000

+0

您是否嘗試根據酒吧系列名稱設置顏色? – Sedrick

回答

2

試試這個:

import com.sun.javafx.charts.Legend; 
import com.sun.javafx.charts.Legend.LegendItem; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.chart.BarChart; 
import javafx.scene.chart.CategoryAxis; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.scene.chart.XYChart.Data; 
import javafx.scene.chart.XYChart.Series; 
import javafx.scene.control.Label; 
import javafx.stage.Stage; 

public class BarChartSample extends Application { 
    final static String austria = "Austria"; 
    final static String brazil = "Brazil"; 
    final static String france = "France"; 
    final static String italy = "Italy"; 
    final static String usa = "USA"; 

    @Override public void start(Stage stage) { 
     stage.setTitle("Bar Chart Sample"); 
     final CategoryAxis xAxis = new CategoryAxis(); 
     final NumberAxis yAxis = new NumberAxis(); 
     final BarChart<String,Number> bc = new BarChart(xAxis,yAxis); 
     bc.setTitle("Country Summary"); 
     xAxis.setLabel("Country");  
     yAxis.setLabel("Value"); 

     XYChart.Series series1 = new XYChart.Series(); 
     series1.setName("2003");  
     series1.getData().add(new XYChart.Data(austria, 25601.34)); 
     series1.getData().add(new XYChart.Data(brazil, 20148.82)); 
     series1.getData().add(new XYChart.Data(france, 10000)); 
     series1.getData().add(new XYChart.Data(italy, 35407.15)); 
     series1.getData().add(new XYChart.Data(usa, 12000));  

     XYChart.Series series2 = new XYChart.Series(); 
     series2.setName("2004"); 
     series2.getData().add(new XYChart.Data(austria, 57401.85)); 
     series2.getData().add(new XYChart.Data(brazil, 41941.19)); 
     series2.getData().add(new XYChart.Data(france, 45263.37)); 
     series2.getData().add(new XYChart.Data(italy, 117320.16)); 
     series2.getData().add(new XYChart.Data(usa, 14845.27)); 

     XYChart.Series series3 = new XYChart.Series(); 
     series3.setName("2005"); 
     series3.getData().add(new XYChart.Data(austria, 45000.65)); 
     series3.getData().add(new XYChart.Data(brazil, 44835.76)); 
     series3.getData().add(new XYChart.Data(france, 18722.18)); 
     series3.getData().add(new XYChart.Data(italy, 17557.31)); 
     series3.getData().add(new XYChart.Data(usa, 92633.68)); 

     Scene scene = new Scene(bc,800,600); 
     bc.getData().addAll(series1, series2, series3); 
     stage.setScene(scene); 
     stage.show(); 

     //Used to change series color. 
     for (XYChart.Series<String, Number> series : bc.getData()) { 
      if(series.getName().equals("2003")) 
      { 
       System.out.println("Series name: " + series.getName()); 
       for(Data data : series.getData()) 
       { 
        data.getNode().setStyle("-fx-bar-fill: firebrick;"); 
       }       
      }      
     } 

     //Used to change legend color 
     for(Node n : bc.getChildrenUnmodifiable()) 
     { 
      if(n instanceof Legend) 
      { 
       System.out.println(((Legend)n).getItems()); 
       for(LegendItem items : ((Legend)n).getItems()) 
       { 
        System.out.println("Legend item text: " + items.getText()); 
        if(items.getText().equals("2003")) 
        { 
         items.getSymbol().setStyle("-fx-bar-fill: firebrick;"); 
        } 
       } 
      } 
     } 

    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

這個程序改變了2003系列顏色對耐火磚。 for循環是您應該關注的部分。

UPDATE 我添加了一種方法來更改圖例顏色。

+0

它更改與系列2003相關的所有酒吧的顏色。我添加了一個鏈接,說明如何更改圖例顏色。你確定,這是你想改變的系列顏色? – Sedrick

+0

好的,像這樣,我可以分別更改每個條的顏色。但我需要分別調整圖例顏色。這不能通過其他問題中提到的查找方法起作用(因爲我再次不能依賴這個系列的順序,這就是爲什麼'chart.lookupAll(「.bar-legend-symbol.default-color0」)'不能工作 – kerner1000

+0

這件作品光彩照人,我愛你Sedrick –