3

我正在 JavaFX 2.2 中动态创建一个 StockkedBarChart(请参见下面的代码片段)用于在图表中绘制相关条形的数据。

      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>);
                    }
                });
            }
4

1 回答 1

5

您可以Node通过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(upSer, downSer, unknownSer) 之后调用此方法:

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

通过 dt.getXValue() 和 dt.getYValue() 获取当前柱值。

于 2013-01-02T14:56:27.097 回答