2015-11-21 5 views
0

Я использую диаграмму SWT, и моя уложенная гистограмма выглядит как на рисунке ниже. Bar char представляет собой время отклика на услуги. Темно-синяя полоса представляет собой техническую часть времени отклика, а светло-голубая полоска представляет собой время мысли.SWT stacked bar chart показать общую стоимость

enter image description here

Мой вопрос теперь, если это возможно, чтобы показать общее время отклика в светло-голубом баре вместо только времени подумать. Например, в третьей строке общее время отклика будет составлять 10952 мс (время технического ответа + время мысли), но оно показывает только время мысли, равное 10000 мс. Кто-нибудь знает, как реализовать это на диаграмме SWT? Заранее благодарим за помощь.

ответ

1

OK Теперь я мог решить эту проблему путем добавления SWT краски слушателя, который всасывает текст для каждого бара:

plotArea.addListener(SWT.Paint, new Listener() { 

     /** 
     * The x-axis offset 
     */ 
     private int xAxisOffset = 8; 

     /** 
     * The y-axis offset. 
     */ 
     private int yAxisOffset = 3; 

     @Override 
     public void handleEvent(final Event event) { 
      GC gc = event.gc; 

      ISeries[] series = chart.getSeriesSet().getSeries(); 

      for (double xAxis : series[0].getXSeries()) { 

       double techTime = series[0].getYSeries()[(int) xAxis]; 
       double thinkTime = series[1].getYSeries()[(int) xAxis]; 

       int totalTime = (int) Math.round(techTime + thinkTime); 
       int xCoord = chart.getAxisSet().getXAxis(0).getPixelCoordinate(xAxis) - this.xAxisOffset; 
       int yCoord = chart.getAxisSet().getYAxis(0).getPixelCoordinate(totalTime/this.yAxisOffset); 

       gc.drawText(totalTime + " ms", yCoord, xCoord, SWT.DRAW_TRANSPARENT); 
      } 
     } 
}); 

После этого SWT гистограмма выглядит следующим образом: enter image description here

Кроме того, чтобы покажите значения для синей полосы и светло-голубой полосы отдельно, я добавил слушателя, который показывает соответствующее значение в тексте всплывающей подсказки при наведении на него мышью:

plotArea.addListener(SWT.MouseHover, new Listener() { 

     @Override 
     public void handleEvent(final Event event) { 
      IAxis xAxis = chart.getAxisSet().getXAxis(0); 
      IAxis yAxis = chart.getAxisSet().getYAxis(0); 

      int x = (int) Math.round(xAxis.getDataCoordinate(event.y)); 
      double y = yAxis.getDataCoordinate(event.x); 

      ISeries[] series = chart.getSeriesSet().getSeries(); 

      double currentY = 0.0; 
      ISeries currentSeries = null; 

      /* over all series */ 
      for (ISeries serie : series) { 
       double[] yS = serie.getYSeries(); 

       if (x < yS.length && x >= 0) { 
        currentY += yS[x]; 
        currentSeries = serie; 

        if (currentY > y) { 
         y = yS[x]; 
         break; 
        } 
       } 
      } 

      if (currentY >= y) { 
       plotArea.setToolTipText(currentSeries.getDescription() + ": " + Math.round(y) + " ms"); 
      } else { 
       plotArea.setToolTipText(null); 
      } 
     } 
}); 
Смежные вопросы