【问题标题】:Hiding Legend for Zero Value Chart Items javaFX隐藏零值图表项的图例 javaFX
【发布时间】:2017-03-29 01:18:48
【问题描述】:

我是论坛的新手,所以我希望我不是在问一个过去已经回答过的问题。在发布之前,我试图彻底寻找答案。

我目前正在制作一个最终将用于跟踪财务费用的饼图。现在我有几个类别组成每个切片。我试图隐藏零值切片的图例。

我在 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);

}
}

【问题讨论】:

  • 建议 1 - 始终尝试以完整的形式提交代码。如果可能,请尝试发布MCVE
  • 感谢您的建议。我用一个更简单的示例更新了代码,并提供了图例的屏幕截图,以及我要删除的内容。
  • 您可以在将它们添加到 ObservableList 之前检查该值是否为零
  • pieChartData.removeIf(data -> data.getPieValue() == 0);

标签: java javafx


【解决方案1】:

我就是这样做的:

    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);

【讨论】:

    【解决方案2】:

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

    下面是一个例子

    • 为源列表配置一个提取器(在 pieValueProperty 上):这样做会通知任何 listChangeListener 该值的变化以及类型更新的变化
    • 在源列表周围包裹一个 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());
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多