Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PieChart(JavaFx)没有';t在Event-JavaFx上显示我的标签_Java_Javafx_Mouseevent_Pie Chart - Fatal编程技术网

PieChart(JavaFx)没有';t在Event-JavaFx上显示我的标签

PieChart(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

我试图在点击时为我的PieChart创建一个标签,但不幸的是,我的标签始终不可见

我在StackOverFlow上发现了一个类似的主题: 但我的应用程序并不是那么简单。由于我的体系结构,我无法将我的标签添加到儿童列表中

(您可以在此处找到一个图表:)

这是我的代码:

PieChartNode.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
将添加到父元素中,否则它将不会显示。所有其他JavaFX
Node
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);
}