【问题标题】:Label is not displayed properly when I exit Pie chart退出饼图时标签显示不正确
【发布时间】:2014-02-18 10:35:35
【问题描述】:

我想创建带有标题的饼图。当我将鼠标移到饼图上时,文本显示非常流畅。

public void naiveAddData(String name, double value)
    {
        pieChartData.add(new Data(name, value));

        caption = new Label();
        caption.setTextFill(Color.DARKORANGE);
        caption.setStyle("-fx-font: 24 arial;");

        for (final Data data : chart.getData())
        {
            data.getNode().addEventHandler(MouseEvent.MOUSE_MOVED,
                new EventHandler<MouseEvent>()
                {
                    @Override
                    public void handle(MouseEvent e)
                    {
                        caption.setTranslateX(e.getSceneX() + 15);
                        caption.setTranslateY(e.getSceneY());
                        caption.setText(String.valueOf(data.getPieValue()) + "%");
                    }
                });
        }
    }

但是当我将鼠标移到饼图之外时,标题仍然存在。它没有被删除。我该如何解决这个问题?

P.S 我设法通过这种方式解决了这个问题:

data.getNode().addEventHandler(MouseEvent.MOUSE_MOVED,
                new EventHandler<MouseEvent>()
                {
                    @Override
                    public void handle(MouseEvent e)
                    {
                        caption.setTranslateX(e.getSceneX() + 15);
                        caption.setTranslateY(e.getSceneY());
                        caption.setText(String.valueOf(data.getPieValue()) + "%");
                        caption.setVisible(true);
                    }
                });

            data.getNode().addEventHandler(MouseEvent.MOUSE_EXITED,
                new EventHandler<MouseEvent>()
                {
                    @Override
                    public void handle(MouseEvent e)
                    {
                        caption.setVisible(false);
                    }
                });
        }

有没有更好的解决方案?

【问题讨论】:

  • 只需向 data.getNode() 添加一个新的 EventHandler 即可删除标题。例如 MouseEvent.MOUSE_EXITED。
  • 我用简单的解决方案编辑了帖子。有没有更好的解决方案?
  • 我使用了 caption.setVisible(false);有没有更好的去除方法?

标签: javafx javafx-2 javafx-8


【解决方案1】:

如果您有标题的父级,则可以在鼠标退出时将其从其父级中删除,并在鼠标进入时再次添加。

    Parent captionparent = ...
    ...
    data.getNode().addEventHandler(MouseEvent.MOUSE_EXITED,
        new EventHandler<MouseEvent>()
        {
            @Override
            public void handle(MouseEvent e)
            {
                captionparent.getChildren().remove(caption);
            }
        });

【讨论】:

    【解决方案2】:

    这是一个使用工具提示的完整示例。

    public class ChartingMain extends Application {
    
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage stage) throws Exception {
        PieChart pc = new PieChart();
        pc.setTitle("Most popular programming languages");
        ObservableList<PieChart.Data> pcdata = FXCollections.<PieChart.Data>observableArrayList();
        pcdata.add(new PieChart.Data("C#", 20d));
        pcdata.add(new PieChart.Data("Java",800d));
        pcdata.add(new PieChart.Data("C/C++", 400d));
        final double total = 20d + 800d + 400d;
        pc.dataProperty().set(pcdata);
        stage.setScene(new Scene(pc));
        stage.show();
        for(PieChart.Data data : pc.getData()){
            final Tooltip t = new Tooltip(data.getName() + " : " + new DecimalFormat("#.##").format((data.getPieValue() / total) * 100) + " %");
            data.getNode().setOnMouseEntered(new EventHandler<MouseEvent>(){
                @Override
                public void handle(MouseEvent me) {
                    if(me.getSource() instanceof Node){
                        Node sender = (Node) me.getSource();
                        Tooltip.install(sender, t);
                        sender.setEffect(new Glow(0.5));
                    }
                }});
            data.getNode().setOnMouseExited(new EventHandler<MouseEvent>(){
                @Override
                public void handle(MouseEvent me) {
                    if(me.getSource() instanceof Node){
                        Node sender = (Node) me.getSource();
                        sender.setEffect(null);
                        t.hide();
                    }
                }});
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 1970-01-01
      • 2014-05-07
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多