当前位置: 首页 > 知识库问答 >
问题:

JavaFX 2.2-将鼠标事件添加到条形图或StockedBarChart中的条形图

莘昊
2023-03-14

我正在JavaFX 2.2中动态创建一个StocckedBarChart(见下面的代码片段)我想让每个条形图充当一个超链接,这样当悬停在它上面时它会发光,当单击它时它会打开一个详细信息屏幕,其中包含有关用于绘制图表中相关条形图的源数据的更多信息。

      final CategoryAxis xAxis = new CategoryAxis();
      final NumberAxis yAxis = new NumberAxis();

        List<String> itemTypes = new ArrayList<String>();
        vipTypes.add("Type A");
        vipTypes.add("Type B");
        vipTypes.add("Type C");


        xAxis.setCategories(FXCollections.<String>observableArrayList(itemTypes));

        m_barChart = new StackedBarChart<String,Number>(xAxis,yAxis);
        m_barChart.setTitle("Item Status");

        XYChart.Series upSer = new XYChart.Series();
        upSer.setName("UP"); 
        XYChart.Series downSer = new XYChart.Series();
        downSer.setName("Down");
        XYChart.Series unknownSer = new XYChart.Series();
        unknownSer.setName("Unknown");

     for(Item item: ItemsList)
        {
            upSer.getData().add(new XYChart.Data<String, Number>(item.getName(),        item.getCountOfUpItems());
            downSer.getData().add(new XYChart.Data<String, Number>(item.getName(),        item.getCountOfDownItems());
            unknownSer.getData().add(new XYChart.Data<String, Number>(item.getName(),      item.getCountOfUnknownItems());
        }

m_barChart.getData().addAll(upSer, downSer, unknownSer);

我想做这样的事情:

   //get a specific bar.

   Node n = m_barChart.lookup("what should I look for??");

            if (n != null && n instanceof Path) 
            {
                final Path path = (Path) n;
                final Glow glow = new Glow(.8);
                path.setEffect(null);
                path.setOnMouseEntered(new EventHandler<MouseEvent>() 
                        {
                    @Override public void handle(MouseEvent e) 
                    {
                        path.setEffect(glow);
                    }
                        });
                path.setOnMouseExited(new EventHandler<MouseEvent>() {
                    @Override public void handle(MouseEvent e) {
                        path.setEffect(null);
                    }
                });
                        path.setOnMouseCLicked(new EventHandler<MouseEvent>() {
                    @Override public void handle(MouseEvent e) {
                        openDetailsScreen(<selected Bar>);
                    }
                });
            }

共有1个答案

别浩漫
2023-03-14

您可以通过XYChart.Data#getNode()访问节点。以下是适用于您的修改示例:

private final Glow glow = new Glow(.8);

private void setupHover(XYChart.Series<String, Number> series) {
    for (final XYChart.Data<String, Number> dt : series.getData()) {
        final Node n = dt.getNode();

        n.setEffect(null);
        n.setOnMouseEntered(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                n.setEffect(glow);
            }
        });
        n.setOnMouseExited(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                n.setEffect(null);
            }
        });
        n.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                System.out.println("openDetailsScreen(<selected Bar>)");
                System.out.println(dt.getXValue() + " : " + dt.getYValue());
            }
        });
    }
}

在m_barChart.getData()之后调用此方法。addAll(向上、向下、未知) :

m_barChart.getData().addAll(upSer, downSer, unknownSer);
setupHover(upSer);
setupHover(downSer);
setupHover(unknownSer);

通过dt获得电流棒值。getXValue()和dt.getYValue()。

 类似资料:
  • 最近在glassdoor-like网站上遇到了一个面试问题,我找不到一个优化的解决方案来解决这个问题: 这和积水问题完全不同。请通读这些例子。 给定一个输入数组,每个元素表示塔的高度,将浇水量,索引号表示浇水位置。每个塔的宽度为1。浇水后打印图表。 备注: > 浇注位置永远不会处于峰值位置。无需考虑分水的情况。 (如果您给出了这种情况的解决方案,您可以假设如果在峰值位置倒入N水,N/2水向左,N/

  • 我试图添加定制器类,以删除条形图中的条形图之间的空间,但我得到了一些错误的iReport后添加定制器类属性包barchart定制器。我还在iReport的类路径中添加了barchartcustomizer.jar。 我的代码:- 但是当我点击预览得到这个错误:- 错误 如何解决这个错误任何建议都会对我很有帮助。

  • 我刚刚开始使用Chart.js,我很快就变得非常沮丧。我有我的堆叠条形图工作,但是我不能让点击“事件”工作。 我在图表中找到了对GitHub的评论。js声明使用函数<code>getBarsAtEvent 我在画布元素上设置了一个事件监听器(正确的方式): ...然而在我的< code>handleClick函数中,< code > chart . getbarsatevent 是未定义的! 现在

  • 我使用chart.js在我的网页上有一个BarChart。 我在其中添加了两个数据点 现在我想要更新那些条A和B,而不是删除它们并再次添加它们(我已经想好了如何做到这一点)。我想让它们垂直移动以适应它们的新值,但我无法找到如何访问图表中已经存在的数据。 没有什么比得上 其中第一个值将是存储数据的索引(F.E.)。 我该怎么做呢?

  • 我的问题类似于Chart.js 2.1.6中图例如何显示条形标签? 我想有相同的输出饼图给出,但我不想创建多个数据集。我设法做到了这一点,但现在我找不到如何做到。 这是我的代码示例: 这是一种方法吗?