隐藏零值图表项目的图例javaFX

时间:2017-03-29 01:18:49

标签: java 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

2 个答案:

答案 0 :(得分:0)

多数民众赞成我这样做:

item

答案 1 :(得分:0)

如果数据是不可变且不可修改的,那么在启动时手动添加一个非空数据条目(或删除空条目)就好了。另一方面,如果它可以在图表的生命周期内改变,我们需要一种机制来自动处理添加/删除:FilteredList来拯救。

以下是

的示例
  • 使用提取器(在pieValueProperty上)配置源列表:执行此操作将通过更新类型update来更改该值时通知任何listChangeListener
  • 围绕源列表包装FilteredList
  • 使用filteredList
  • 配置pieChart

有了这个,我们可以在filteredList上安装一个谓词,根据需要隐藏项目:该示例使用Slider来更新数据值应包含在图表中的较低阈值。

不幸的是,PieChart有一个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());

}