java - PieChart (JavaFx) 没有在事件上显示我的标签 - JavaFx

标签 java javafx mouseevent pie-chart

我尝试为我的饼图创建点击标签,但不幸的是我的标签永远不可见。

我在 StackOverFlow 上发现了一个类似的主题:Label not showing on mouse event JavaFx 但我的应用程序并不那么简单。由于我的架构,我无法将我的标签添加到子列表中。

(您可以在此处找到图表:http://i.stack.imgur.com/ZFJaR.png)

这里是我的代码:

PieChartNode.java

    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.Node;
    import javafx.scene.chart.PieChart;
    import javafx.scene.control.Label;
    import javafx.scene.input.MouseEvent;
    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 Node node;

    public PieChartNode(ListRepere categories, ArrayList<ValueStat> values){
            this.categories = categories;
            this.values = values;

            pieChartData = FXCollections.observableArrayList();
            node = new PieChart(pieChartData);

            Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                            formatData();
                    }
            });
    }

    private void formatData() {
            final Label caption = new Label("");
            caption.setTextFill(Color.DARKORANGE);
            caption.setStyle("-fx-font: 24 arial;");                

            for(ValueStat v : values){
                    PieChart.Data dataTemp = new PieChart.Data(v.getCategorie().getStringName(),v.getDoubleValue());
                    pieChartData.add(dataTemp);

                    dataTemp.getNode().addEventHandler(MouseEvent.MOUSE_CLICKED,
                    new EventHandler<MouseEvent>() {
                            @Override public void handle(MouseEvent e) {
                                    System.out.println("event : "+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("label "+caption);
                            }
                    });
            }
    }

    @Override
    public Node getNodeGraph() {
            return node;
    }

    @Override
    public void setOptions(OptionsChart optionsChart) {
            //To implemente
    }

    }

你知道如何将我的标签添加到场景中吗?

谢谢!

(另一个问题,为什么 PieChart.Data 的节点是 ReadOnly ?)

僵尸键。

PS:抱歉我的英语不好,我是法国学生,我还在学习:) Ps 2 : 第一次上 StackOverflow,如果我做错了,请告诉我!

最佳答案

好的!我为我的案例找到了解决方案!

从语义上讲,我的 Label 仅适用于我的 PieChart。这就是为什么我不想把它放到我的 SceneGraph 中。 我的 ChartFactory 返回一个 Node,然后显示它。所以我的节点必须包含 PieChartLabel

我用 StackPane 创建了一个 Group。在 StackPane 中,我添加了我的 PieChart 和我的 Label。然后我的工厂将 Group 作为 Node 返回。

放下代码!

    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
    }

    }

感谢@eckig 的回答!

关于java - PieChart (JavaFx) 没有在事件上显示我的标签 - JavaFx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29647257/

相关文章:

java - 英特尔实感 java 支持

javac 在当前文件夹中找不到另一个已编译的类

java - 按住按钮时对多个节点进行 MouseDragged 检测 JavaFX

javascript - 每 0.2 秒运行一次 mousedown 事件,直到鼠标松开

java - 从单元格中检索 JTable 的行号

用于求解斐波那契的 Java 8 Lambda 表达式(非递归方式)

javafx - ListChangeListener.Change : how to properly handle updated and permutated items

java - 忽略从轻量级组件生成的 AWT 组件上的 Java 鼠标事件

java - Spring batch-处理后从目录中删除平面文件

java - 使用线程发出数据库请求