PieChart(JavaFx)没有';t在Event-JavaFx上显示我的标签
我试图在点击时为我的PieChart创建一个标签,但不幸的是,我的标签始终不可见 我在StackOverFlow上发现了一个类似的主题: 但我的应用程序并不是那么简单。由于我的体系结构,我无法将我的标签添加到儿童列表中 (您可以在此处找到一个图表:) 这是我的代码: PieChartNode.javaPieChart(JavaFx)没有';t在Event-JavaFx上显示我的标签,java,javafx,mouseevent,pie-chart,Java,Javafx,Mouseevent,Pie Chart,我试图在点击时为我的PieChart创建一个标签,但不幸的是,我的标签始终不可见 我在StackOverFlow上发现了一个类似的主题: 但我的应用程序并不是那么简单。由于我的体系结构,我无法将我的标签添加到儿童列表中 (您可以在此处找到一个图表:) 这是我的代码: PieChartNode.java package nodeStatsVision.chartFactory; 导入java.util.ArrayList; 导入javafx.application.Platform; 导入java
package nodeStatsVision.chartFactory;
导入java.util.ArrayList;
导入javafx.application.Platform;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.event.EventHandler;
导入javafx.scene.Node;
导入javafx.scene.chart.PieChart;
导入javafx.scene.control.Label;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.paint.Color;
导入nodeStatsVision.beans.listreme;
导入nodeStatsVision.beans.options图表;
导入nodeStatsVision.beans.ValueStat;
/**
*
*@author Zombkey。
*/
公共类PieChartNode实现ChartNode{
私人名册类别;
私有数组列表值;
私有可观测数据;
专用节点;
公共PieChartNode(列表目录类别、ArrayList值){
这个。类别=类别;
这个值=值;
pieChartData=FXCollections.observableArrayList();
节点=新PieChart(pieChartData);
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
格式化数据();
}
});
}
私有void formatData(){
最终标签标题=新标签(“”);
标题.setTextFill(Color.DARKORANGE);
标题.setStyle(“-fx字体:24 arial;”);
用于(ValueStat v:值){
PieChart.Data dataTemp=new PieChart.Data(v.getCategorie().getStringName(),v.getDoubleValue());
pieChartData.add(dataTemp);
dataTemp.getNode().addEventHandler(单击MouseEvent.MOUSE_,
新的EventHandler(){
@重写公共无效句柄(MouseEvent e){
System.out.println(“事件:+v.getCategorie().getStringName()+”:“+v.getDoubleValue());
caption.setTranslateX(e.getSceneX());
caption.setTranslateY(e.getSceneY());
caption.setText(String.valueOf(dataTemp.getPieValue());
caption.setVisible(true);
System.out.println(“标签”+标题);
}
});
}
}
@凌驾
公共节点getNodeGraph(){
返回节点;
}
@凌驾
公共无效设置选项(选项图表选项图表){
//实施
}
}
你知道如何将我的标签添加到场景中吗
谢谢
(另一个问题,为什么PieChart.Data的节点是只读的?)
佐姆布基
PS:对不起我的英语,我是一名法国学生,我还在学习:)
Ps 2:第一次在StackOverflow上,如果我做错了,告诉我 您创建并设置名为
标题的标签
样式,但从不将其添加到场景图中
必须在某个地方将其添加到父元素,否则它将无法显示
您的PieChart
将添加到父元素中,否则它将不会显示。所有其他JavaFXNode
s也是如此
关于第二个问题,请阅读JavaDocs:
对表示饼图切片的节点的只读访问。您可以使用它添加鼠标事件侦听器等
好的!我为我的案子找到了解决办法
从语义上讲,我的标签
仅适用于我的PieChart
。这就是为什么我不想把它放在我的场景图上。
My ChartFactory返回一个节点
,然后显示它。因此,我的节点必须包含PieChart
和标签
我使用堆栈窗格创建了一个组
。在StackPane
中,我添加了我的PieChart
和我的标签
。然后我的工厂将组
作为节点
返回
放下密码
package nodeStatsVision.chartFactory;
import java.util.ArrayList;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import nodeStatsVision.beans.ListRepere;
import nodeStatsVision.beans.OptionsChart;
import nodeStatsVision.beans.ValueStat;
/**
*
* @author Zombkey.
*/
public class PieChartNode implements ChartNode {
private ListRepere categories;
private ArrayList<ValueStat> values;
private ObservableList<PieChart.Data> pieChartData;
private Group group;
private Node node;
private final Label caption;
public PieChartNode(ListRepere categories, ArrayList<ValueStat> values){
this.categories = categories;
this.values = values;
group = new Group();
StackPane pane = new StackPane();
group.getChildren().add(pane);
pieChartData = FXCollections.observableArrayList();
node = new PieChart(pieChartData);
pane.getChildren().add(node);
caption = new Label("");
caption.setVisible(false);
caption.getStyleClass().addAll("chart-line-symbol", "chart-series-line");
caption.setStyle("-fx-font-size: 12; -fx-font-weight: bold;");
caption.setMinSize(Label.USE_PREF_SIZE, Label.USE_PREF_SIZE);
pane.getChildren().add(caption);
Platform.runLater(new Runnable() {
@Override
public void run() {
formatData();
}
});
}
private void formatData() {
for(ValueStat v : values){
PieChart.Data dataTemp = new PieChart.Data(v.getCategorie().getStringName(),v.getDoubleValue());
pieChartData.add(dataTemp);
dataTemp.getNode().addEventHandler(MouseEvent.MOUSE_ENTERED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
caption.setTranslateX(e.getX());
caption.setTranslateY(e.getY());
caption.setText(String.valueOf(dataTemp.getPieValue()));
caption.setVisible(true);
}
});
dataTemp.getNode().addEventHandler(MouseEvent.MOUSE_EXITED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
caption.setVisible(false);
}
});
}
}
@Override
public Node getNodeGraph() {
return (Node)group;
}
@Override
public void setOptions(OptionsChart optionsChart) {
//To implemente
}
}
package nodeStatsVision.chartFactory;
导入java.util.ArrayList;
导入javafx.application.Platform;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.event.EventHandler;
导入javafx.scene.Group;
导入javafx.scene.Node;
导入javafx.scene.Parent;
导入javafx.scene.chart.PieChart;
导入javafx.scene.control.Label;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入nodeStatsVision.beans.listreme;
导入nodeStatsVision.beans.options图表;
导入nodeStatsVision.beans.ValueStat;
/**
*
*@author Zombkey。
*/
公共类PieChartNode实现ChartNode{
私人名册类别;
私有数组列表值;
私有可观测数据;
私人集团;
专用节点;
专用最终标签标题;
公共PieChartNode(列表目录类别、ArrayList值){
这个。类别=类别;
这个值=值;
组=新组();
StackPane=新的StackPane();
group.getChildren().add(窗格);
pieChartData=FXCollections.observableArrayList();
节点=新PieChart(pieChartData);
pane.getChildren().add(节点);
标题=新标签(“”);
标题.setVisible(false);
caption.getStyleClass().addAll(“图表-
package nodeStatsVision.chartFactory;
import java.util.ArrayList;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import nodeStatsVision.beans.ListRepere;
import nodeStatsVision.beans.OptionsChart;
import nodeStatsVision.beans.ValueStat;
/**
*
* @author Zombkey.
*/
public class PieChartNode implements ChartNode {
private ListRepere categories;
private ArrayList<ValueStat> values;
private ObservableList<PieChart.Data> pieChartData;
private Group group;
private Node node;
private final Label caption;
public PieChartNode(ListRepere categories, ArrayList<ValueStat> values){
this.categories = categories;
this.values = values;
group = new Group();
StackPane pane = new StackPane();
group.getChildren().add(pane);
pieChartData = FXCollections.observableArrayList();
node = new PieChart(pieChartData);
pane.getChildren().add(node);
caption = new Label("");
caption.setVisible(false);
caption.getStyleClass().addAll("chart-line-symbol", "chart-series-line");
caption.setStyle("-fx-font-size: 12; -fx-font-weight: bold;");
caption.setMinSize(Label.USE_PREF_SIZE, Label.USE_PREF_SIZE);
pane.getChildren().add(caption);
Platform.runLater(new Runnable() {
@Override
public void run() {
formatData();
}
});
}
private void formatData() {
for(ValueStat v : values){
PieChart.Data dataTemp = new PieChart.Data(v.getCategorie().getStringName(),v.getDoubleValue());
pieChartData.add(dataTemp);
dataTemp.getNode().addEventHandler(MouseEvent.MOUSE_ENTERED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
caption.setTranslateX(e.getX());
caption.setTranslateY(e.getY());
caption.setText(String.valueOf(dataTemp.getPieValue()));
caption.setVisible(true);
}
});
dataTemp.getNode().addEventHandler(MouseEvent.MOUSE_EXITED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
caption.setVisible(false);
}
});
}
}
@Override
public Node getNodeGraph() {
return (Node)group;
}
@Override
public void setOptions(OptionsChart optionsChart) {
//To implemente
}
}
for (final PieChart.Data temp : pieChart.getData()) {
Tooltip tooltip = new Tooltip(String.valueOf(temp.getPieValue()));
Tooltip.install(temp.getNode(), tooltip);
}