Java jfreechart:条形图总标签定位问题?

Java jfreechart:条形图总标签定位问题?,java,jfreechart,Java,Jfreechart,我使用下面的代码在条形图的条形图上定位total标签。该位置应该位于每个渲染条的顶部。但是由于某种原因,标签渲染会弄乱整个图表 更新定位总数标签发布每个条的总数应位于每个条的顶部中心!取而代之的是,它随机放置在靠近顶部的某个位置,而不是与条对齐 以下行在渲染图表标签上有问题: ItemLabelAnchor labelAnchor = "O".equals(direction) ? ItemLabelAnchor.OUTSIDE12 : ItemLabelAnchor.INSIDE8; Text

我使用下面的代码在条形图的条形图上定位total标签。该位置应该位于每个渲染条的顶部。但是由于某种原因,标签渲染会弄乱整个图表

更新定位总数标签发布每个条的总数应位于每个条的顶部中心!取而代之的是,它随机放置在靠近顶部的某个位置,而不是与条对齐

以下行在渲染图表标签上有问题:

ItemLabelAnchor labelAnchor = "O".equals(direction) ? ItemLabelAnchor.OUTSIDE12 : ItemLabelAnchor.INSIDE8;
TextAnchor textAnchor = "O".equals(direction) ? TextAnchor.TOP_CENTER : TextAnchor.CENTER;
TextAnchor rotationAnchor = "O".equals(direction) ? TextAnchor.TOP_CENTER : TextAnchor.BOTTOM_CENTER;
renderer.setSeriesPositiveItemLabelPosition(0,
        new ItemLabelPosition(labelAnchor, textAnchor, rotationAnchor, ((angle * Math.PI) / 180)));
我使用jdk8和jFreeChart-1.0.19。以下是完整的代码列表:

CategoryPlot plot = chart.getCategoryPlot();

if (plot != null) {
if (log.isDebugEnabled()) {
    log.debug("Total Renderers : " + plot.getRendererCount());
}
try {
    JRPropertiesMap propMap = jasperChart.getPropertiesMap();
    if (propMap.containsProperty(APPLY_LABEL_ROTATION)) {
        DecimalFormat dfKey = new DecimalFormat("###,###");

       /* {0} - label would be equal to Series expression,
       * {1} - label would be equal to Category expression,
       * {2} - label would be equal to Value expression
       */
    StandardCategoryItemLabelGenerator labelGenerator = new    StandardCategoryItemLabelGenerator("{2}", dfKey);

LegendItemCollection lic = new LegendItemCollection();
List<LegendItem> legendList = new ArrayList<LegendItem>();
LegendItem totalOpenLegend = null;
for (int i = 0; i <= (plot.getRendererCount() - 1); i++) {

    String prop = propMap.getProperty("Chart_" + (i + 1));

    Double angle = null == prop ? 0D : Double.valueOf(prop.substring(0, prop.length() - 1));
    String direction = null == prop ? "O" : "" + prop.charAt(prop.length() - 1);
    if (log.isDebugEnabled()) {
        log.debug("Property value for renerer : " + i + " Chart_" + (i + 1) + "  angle : " + angle + ", Direction : " + direction);
    }

    CategoryItemRenderer renderer = plot.getRenderer(i);
    renderer.setBaseItemLabelsVisible(true);
    renderer.setBaseItemLabelGenerator(labelGenerator);

    if (i == 0) {
        Shape shape = ShapeUtilities.createLineRegion(new Line2D.Double(-6, 0, 6, 0), 1);
        ((LineAndShapeRenderer) renderer).setSeriesShape(0, shape);
        ((LineAndShapeRenderer) renderer).setBaseItemLabelsVisible(false);
    }

    if (i == 1) {
        //shape = ShapeUtilities.createLineRegion(new Line2D.Double(0, 0, 1, 1), 2);
        ((LineAndShapeRenderer) renderer).setBaseShapesFilled(false);
        ((LineAndShapeRenderer) renderer).setBaseItemLabelPaint(Color.RED);
    }

    if (i == 2) {
        ((LineAndShapeRenderer) renderer).setBaseItemLabelsVisible(false);
    }

    if (i == 3) {
        ((LineAndShapeRenderer) renderer).setBaseItemLabelPaint(new Color(139, 90, 43));
    }

    LegendItem item = renderer.getLegendItem(i, 0);

    if ((i >= 0) && (i < 4)) {
        legendList.add(item);
    } else {
        totalOpenLegend = item;
        BarRenderer barRenderer = (BarRenderer) renderer;
        barRenderer.setMaximumBarWidth(0.3);
        barRenderer.setItemMargin(0.1);
    }

    ItemLabelAnchor labelAnchor = "O".equals(direction) ? ItemLabelAnchor.OUTSIDE12 : ItemLabelAnchor.INSIDE8;
    TextAnchor textAnchor = "O".equals(direction) ? TextAnchor.TOP_CENTER : TextAnchor.CENTER;
    TextAnchor rotationAnchor = "O".equals(direction) ? TextAnchor.TOP_CENTER : TextAnchor.BOTTOM_CENTER;
    renderer.setSeriesPositiveItemLabelPosition(0,
            new ItemLabelPosition(labelAnchor, textAnchor, rotationAnchor, ((angle * Math.PI) / 180)));
    //--
    plot.setRenderer(i, renderer);
}

lic.add(totalOpenLegend);

for (LegendItem li : legendList) {
    lic.add(li);
}
System.out.println("Setting Legend Items");
plot.setFixedLegendItems(lic);
plot.getDomainAxis().setLowerMargin(0);
CategoryPlot=chart.getCategoryPlot();
if(plot!=null){
if(log.isDebugEnabled()){
debug(“总渲染器数:+plot.getRenderCount());
}
试一试{
JRPropertiesMap propMap=jaspercart.getPropertiesMap();
if(propMap.containsProperty(应用标签旋转)){
DecimalFormat dfKey=新的DecimalFormat(“#####,####”);
/*{0}-标签将等于系列表达式,
*{1}-标签将等于类别表达式,
*{2}-标签将等于值表达式
*/
StandardCategoryItemLabelGenerator labelGenerator=新的StandardCategoryItemLabelGenerator(“{2}”,dfKey);
LegendItemCollection lic=新LegendItemCollection();
List legendList=new ArrayList();
LegendItem totalOpenLegend=null;
对于(int i=0;i=0)和&(i<4)){
添加(项目);
}否则{
totalOpenLegend=项目;
BarRenderer BarRenderer=(BarRenderer)渲染器;
荒地者设置最大宽度(0.3);
Ballenderer.setItemMargin(0.1);
}
ItemLabelAnchor labelAnchor=“O”。等于(方向)?ItemLabelAnchor.outside 12:ItemLabelAnchor.INSIDE8;
TextAnchor TextAnchor=“O”。等于(方向)?TextAnchor.TOP\u CENTER:TextAnchor.CENTER;
TextAnchor rotationAnchor=“O”。等于(方向)?TextAnchor.TOP\u CENTER:TextAnchor.BOTTOM\u CENTER;
renderer.setSeriesPositiveItemLabelPosition(0,
新项目LabelPosition(labelAnchor、textAnchor、rotationAnchor,((角度*数学PI)/180));
//--
plot.setRenderer(i,renderer);
}
lic.add(totalOpenLegend);
对于(LegendItem li:legendList){
加上(li);
}
System.out.println(“设置图例项”);
plot.setFixedLegendItems(lic);
plot.getDomainAxis().setLowerMargin(0);

标签的定位方式与您的预期不符?请明确您所说的“混乱”是什么意思;然后,编辑您的问题,使其包含一个显示您描述的问题,但将问题与外部元素(如形状和属性)隔离开来的问题。我已使用带注释的屏幕截图编辑了该问题。