隐藏零值图表项的图例javaFX
我是论坛的新手,所以我希望我没有问一个过去已经回答过的问题。在发布之前,我试图彻底寻找答案 我目前正在制作一个饼图,最终将用于跟踪财务费用。现在,我有几个类别组成了每个部分。我试图隐藏零值切片的图例 我用javaFX做这个。说到编程,我还是个新手,没有Java以外的经验。如有任何向假人解释的帮助,将不胜感激。谢谢 添加了一张图片和完整的代码来说明手头的问题。餐厅和餐饮、购物和娱乐都是零价值的。我想在本例中隐藏这些项目的图例隐藏零值图表项的图例javaFX,java,javafx,Java,Javafx,我是论坛的新手,所以我希望我没有问一个过去已经回答过的问题。在发布之前,我试图彻底寻找答案 我目前正在制作一个饼图,最终将用于跟踪财务费用。现在,我有几个类别组成了每个部分。我试图隐藏零值切片的图例 我用javaFX做这个。说到编程,我还是个新手,没有Java以外的经验。如有任何向假人解释的帮助,将不胜感激。谢谢 添加了一张图片和完整的代码来说明手头的问题。餐厅和餐饮、购物和娱乐都是零价值的。我想在本例中隐藏这些项目的图例 package Example; import java.net.UR
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在重置谓词时触发的)
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());
}
第一条建议-始终尝试以完整的形式提交代码。如果可能的话,试着发一封邮件。谢谢你的建议。我用一个更简单的例子更新了代码,并提供了图例的屏幕截图,以及我试图删除的内容。在将它们添加到