2013-01-02 19 views
3

我正在JavaFX 2.2中動態創建StocckedBarChart(請參閱下面的代碼片段) 我想讓每個條形圖充當超鏈接,以便當它懸停在上面時它會發光,點擊它時會打開一個詳細信息屏幕,提供有關用於繪製圖表中相關條形圖的源數據的更多信息。JavaFX 2.2 - 將鼠標事件添加到BarChart或StockedBarChart中的條形圖

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

回答

5

您可以通過訪問XYChart.Data#getNode()Node。這裏施加到你的修改的一個示例:

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()。

+0

謝謝!此代碼完美工作 – ranef

相關問題