隐藏零值图表项的图例javaFX

隐藏零值图表项的图例javaFX,java,javafx,Java,Javafx,我是论坛的新手,所以我希望我没有问一个过去已经回答过的问题。在发布之前,我试图彻底寻找答案 我目前正在制作一个饼图,最终将用于跟踪财务费用。现在,我有几个类别组成了每个部分。我试图隐藏零值切片的图例 我用javaFX做这个。说到编程,我还是个新手,没有Java以外的经验。如有任何向假人解释的帮助,将不胜感激。谢谢 添加了一张图片和完整的代码来说明手头的问题。餐厅和餐饮、购物和娱乐都是零价值的。我想在本例中隐藏这些项目的图例 package Example; import java.net.UR

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

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

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

}
}
包示例;
导入java.net.URL;
导入java.util.ResourceBundle;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.scene.chart.PieChart;
公共类PieExampleController实现可初始化{
@FXML
私人海图;
@凌驾
公共void初始化(URL arg0,ResourceBundle arg1){
//TODO自动生成的方法存根
ObservableList pieChartData=FXCollections.observableArrayList(
新PieChart.数据(“杂货”,1),
新图表数据(“运输”,1),
新PieChart.数据(“餐厅和餐饮”,0),
新PieChart.数据(“购物和娱乐”,0);
pieChart.setData(pieChartData);
}
}
我就是这样做的:

    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);
List dataArrayList=newlinkedlist();
如果(值1>0){
数据数据=新的PieChart.Data(“我的标签”,值1);
添加(数据);
}
...
可观察列表数据=
FXCollections.observableArrayList(dataArrayList);

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

下面是一个例子:

  • 使用提取器配置源列表(在pieValueProperty上):这样做将在该值发生更改时通知任何listChangeListener,并更改更新类型
  • 围绕源列表包装FilteredList
  • 使用filteredList配置pieChart
这样,我们就可以在filteredList上安装一个谓词,根据需要隐藏项目:该示例使用一个滑块来更新图表中应该包含哪些数据值的下限阈值

不幸的是,PieChart有一个(叹息…无论我在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());

}
公共类FilteredPichartExample扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
FilteredList filtered=getChartData();
//ListChangeReport=新的ListChangeReport(已过滤);
PieChart PieChart=新PieChart(已过滤);
//pieChart中的错误:无法处理动画打开时的数据修改
pieChart.setAnimated(假);
//使用滑块为饼图中显示的数据值设置较低的阈值
滑块=新滑块(-1,100.,-1.);
slider.valueProperty().addListener((src、ov、nv)->{
//实际上,根本无法处理数据修改…需要先清除。。。
//pieChart.dataChangeListener中的错误:未正确处理替换的
filtered.setPredicate(数据->假);
filtered.setPredicate(数据->数据.getPieValue()>nv.doubleValue());
//report.prettyPrint();
});
初级阶段。片名(“PieChart”);
窗格根=新的VBox(图形图表、滑块);
场景=新场景(根);
初级阶段。场景(场景);
primaryStage.show();
}
私有筛选器列表getChartData(){
//在pieValueProperty上使用带提取器的ObservableList
ObservableList answer=FXCollections.observableArrayList(
e->new Observable[]{e.pieValueProperty()}
);
答案:addAll(
新数据(“java”,17.56),
新数据(“C”,17.06),
新数据(“C++”,8.25),
新数据(“C#”,8.20),
新数据(“ObjectiveC”,6.8),
新数据(“PHP”,6.0),
新数据(“(视觉)基础”,4.76),
新数据(“其他”,31.37),
新数据(“空”,0)
);
返回新的过滤器列表(应答);
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
@抑制警告(“未使用”)
私有静态最终记录器LOG=Logger.getLogger(filteredpichartexample.class
.getName());
}

第一条建议-始终尝试以完整的形式提交代码。如果可能的话,试着发一封邮件。谢谢你的建议。我用一个更简单的例子更新了代码,并提供了图例的屏幕截图,以及我试图删除的内容。在将它们添加到