2017-03-29 86 views
3

我是新來的論壇,所以我希望我不會問過去已經回答的問題。我試圖在發佈前徹底尋找答案。隱藏零值圖表項目的圖例javaFX

我目前正在製作一個餅圖,最終將用於跟蹤財務費用。現在我有幾個類別組成每個切片。我試圖隱藏零值切片的圖例。

我在javaFX中這樣做。在編程方面,我仍然很綠,並且沒有Java以外的經驗。任何幫助解釋到假人將不勝感激。謝謝。

添加了一張圖片和完整的代碼來說明手頭的問題。餐廳&餐飲和購物&娛樂都有零價值。我想在這個例子中隱藏這些項目的圖例。

package Example; 

import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.chart.PieChart; 

public class PieExampleController implements Initializable { 

@FXML 
private PieChart pieChart; 

@Override 
public void initialize(URL arg0, ResourceBundle arg1) { 
    // TODO Auto-generated method stub 

    ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(
      new PieChart.Data("Groceries", 1), 
      new PieChart.Data("Transportation", 1), 
      new PieChart.Data("Restaurants & Dining", 0), 
      new PieChart.Data("Shopping & Entertainment", 0)); 

     pieChart.setData(pieChartData); 

} 
} 

enter image description here

+0

建議沒有1 - 總是試圖在他們的完整形式提交代碼。如果可能,請嘗試發佈[MCVE](http://stackoverflow.com/help/mcve)。 – ItachiUchiha

+0

感謝您的建議。我用一個更簡單的例子更新了代碼,並提供了圖例的屏幕截圖以及我想要刪除的內容。 – RingoStarr

+0

您可以在將它們添加到ObservableList之前檢查它是否爲零 – uesports135

回答

0

這就是我如何做到這一點:如果數據是不可變的,

List<PieChart.Data> dataArrayList = new LinkedList<Data>(); 
    if (value1>0) { 
      Data data = new PieChart.Data("my label", value1); 
      dataArrayList.add(data); 
    } 
    ... 

    ObservableList<PieChart.Data> pieChartData = 
    FXCollections.observableArrayList(dataArrayList); 
0

在啓動時只添加非空數據項(或去除空條目)手動一次就好了不可修改。另一方面,如果它可以在圖表的生命週期中更改,我們需要一種機制來處理自動添加/刪除:FilteredList來拯救。

下面是一個例子

  • 配置一個源列表與提取器(在pieValueProperty):這樣做將通知與類型更新的改變該值的變化的任何listChangeListener
  • 包裝一個filteredList周圍的源列表
  • 配置餅圖與filteredList

有了到位,我們可以安裝在filteredList謂詞根據需要隱藏項目:示例使用Slider更新圖表中應包含哪些數據值的較低閾值。

不幸的是,餅圖具有couple of bugs(嘆氣......不管我在FX觸摸,他們總是沸騰了起來......)與這種簡單的設置

  • 干擾,由於節點的一個奇特的混合/值加上「優化的」內部數據結構,以及將內部(鏈接的)數據結構與列表更改同步的錯誤實施,圖表不能動畫
  • 同步無法處理所有類型的替換(這是什麼FilteredList在重置謂詞時觸發)

在一個示例中,通過在設置實際條件之前禁用動畫並清除列表(設置阻止所有的謂詞),可以避免這兩個問題。在生產代碼中,這樣的調整可能會也可能不會。

的例子:

public class FilteredPieChartExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     FilteredList<Data> filtered = getChartData(); 
     //ListChangeReport report = new ListChangeReport(filtered); 

     PieChart pieChart = new PieChart(filtered); 
     // bug in pieChart: can't handle data modification with animation on 
     pieChart.setAnimated(false); 

     // use slider to set lower threshhold for value of data to show in pie 
     Slider slider = new Slider(-1., 100., -1.); 
     slider.valueProperty().addListener((src, ov, nv) -> { 
      // actually, cannot handle data modification at all ... need to clear out first ... 
      // bug in pieChart.dataChangeListener: doesn't handle replaced correctly 
      filtered.setPredicate(data -> false); 
      filtered.setPredicate(data -> data.getPieValue() > nv.doubleValue()); 
      //report.prettyPrint(); 
     }); 
     primaryStage.setTitle("PieChart"); 
     Pane root = new VBox(pieChart, slider); 
     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private FilteredList<Data> getChartData() { 
     // use ObservableList with extractor on pieValueProperty 
     ObservableList<Data> answer = FXCollections.observableArrayList(
       e -> new Observable[] {e.pieValueProperty()} 
       ); 
     answer.addAll(
       new Data("java", 17.56), 
       new Data("C", 17.06), 
       new Data("C++", 8.25), 
       new Data("C#", 8.20), 
       new Data("ObjectiveC", 6.8), 
       new Data("PHP", 6.0), 
       new Data("(Visual)Basic", 4.76), 
       new Data("Other", 31.37), 
       new Data("empty", 0) 
       ); 
     return new FilteredList<>(answer); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @SuppressWarnings("unused") 
    private static final Logger LOG = Logger.getLogger(FilteredPieChartExample.class 
      .getName()); 

}