PieChart(JavaFx)没有在Event - JavaFx上显示我的Label

时间:2015-04-15 10:01:40

标签: java javafx mouseevent pie-chart

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

我在StackOverFlow上发现了类似的主题:Label not showing on mouse event JavaFx 但我的申请并不那么简单。由于我的架构,我无法将我的Label添加到孩子列表中。

(您可以在此处找到图表: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上?)

Zombkey。

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

3 个答案:

答案 0 :(得分:1)

您可以创建Label名为caption的样式,但不要将其添加到SceneGraph中。

某处必须将其添加到Parent元素,否则将无法显示。

您的PieChart被添加到父元素,否则将不会显示。所有其他JavaFX Node也是如此。


关于你的第二个问题,请阅读JavaDocs:

  

只读访问表示饼图切片的节点。您可以使用它来添加鼠标事件侦听器等。

答案 1 :(得分:1)

好的!我为我的案子找到了一个解决方案!

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

我使用Group创建StackPane。在StackPane我添加了PieChartLabel。然后我的工厂将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的回答!

答案 2 :(得分:0)

您可以使用<jsp-config> <taglib> <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri> <taglib-location>/tld/c.tld</taglib-location> </taglib> <taglib> <taglib-uri>myCustomLib</taglib-uri> <taglib-location>/tld/custom.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri> <taglib-location>/tld/fmt.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jsp/jstl/fn</taglib-uri> <taglib-location>/tld/fn.tld</taglib-location> </taglib> ... </jsp-config> 来显示值:

Tooltip