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

图像作为iReport图表中的类别标签

司徒云
2023-03-14

我正在尝试创建一个条形图,其中包含类别标签(x轴标签)的图像。对于默认条形图,类别表达式的结果用作标签(必须是String)。如何自定义以显示图像?我已经编写了一个scriptlet来用BufferedImages填充变量,现在我只需要一种方法来使用它们。我可以用图表定制类来实现吗?有没有更简单/更好的方法?

共有1个答案

邹英发
2023-03-14

正如您所说,您可以通过自己的定制器类来做到这一点。这是一个可以根据您的需求进行增强的简单示例:

@Slf4j 
public class CategoryAxisWithImagesCustomizer extends JRAbstractChartCustomizer {
    public class CategoryAxisWithImages extends CategoryAxis {
        public CategoryAxisWithImages(String label) {
            super(label);
        }

        @Override
        protected Rectangle2D getLabelEnclosure(Graphics2D g2, RectangleEdge edge) {
            // enter max width and height of your images or you can do it dynamically
            return new Rectangle2D.Double(0, 0, 32, 32);
        }

        @Override
        protected AxisState drawCategoryLabels(Graphics2D g2, Rectangle2D plotArea, Rectangle2D dataArea, RectangleEdge edge, AxisState state, PlotRenderingInfo plotState) {
            if (!isTickLabelsVisible()) {
                return state;
            }

            List ticks = refreshTicks(g2, state, plotArea, edge);
            state.setTicks(ticks);
            for (int i = 0; i < ticks.size(); i++) {
                double x = getCategoryMiddle(i, ticks.size(), dataArea, edge);
                double y = state.getCursor() + getCategoryLabelPositionOffset();

                int value = (int) ((CategoryPlot) getPlot()).getDataset().getColumnKey(i);
                String imagePath = "logo_" + value + ".png";
                try {
                    InputStream imageStream = getClass().getResourceAsStream(imagePath);
                    // you can of course load images using different way - here I'm using index value from the dataset
                    BufferedImage image = ImageIO.read(imageStream);
                    g2.drawImage(image, (int) (x - image.getWidth() / 2d), (int) (y), image.getWidth(), image.getHeight(), Color.black, null);
                } catch (IOException e) {
                    log.error("Cannot load image {}", imagePath);
                }
            }
            state.cursorDown(state.getMax() + getCategoryLabelPositionOffset());
            return state;
        }
    }

    @Override
    public void customize(JFreeChart chart, JRChart jasperChart) {
        CategoryPlot plot = chart.getCategoryPlot();
        CategoryAxis categoryAxis = new CategoryAxisWithImages(plot.getDomainAxis().getLabel());
        plot.setDomainAxis(categoryAxis);
    }
}

在JasperReport JRXML中,您可以像这样注册定制器类:

    <barChart>
        <chart customizerClass="cz.trask.experiment.jr.CategoryAxisWithImagesCustomizer"
               isShowLegend="false">
            <reportElement x="0" y="0" width="550" height="348" uuid="a2cbb6b5-a76d-469b-8e8e-daa533260f20"/>
            <chartTitle/>
            <chartSubtitle/>
            <chartLegend/>
        </chart>
        ...
    </barChart>
 类似资料:
  • 出于某种原因,我的图像图标正在出现错误,尽管我试图修复它... 我读过这个问题,答案建议在mitmap文件夹中创建图像图标。因此,我将代码行从更改为 您可以看到图像上有一个错误。为什么会这样? 我曾试图: 清洁项目 重建项目 确保@mitmap/ic_启动器确实存在: 即使在我所有的尝试之后,错误仍然存在。我已经被困在这个问题上好几个小时了,我的脑袋都转不过来了。这是我的代码还是android s

  • 我通过图像视图显示了程序中的图标。按下按钮时,黄色图标应变为红色。我尝试了所有方法,但没有一个有效。...背景颜色...他把图像视图变成红色,呈全正方形。我只想让图标改变颜色。这是非常困难的'请帮忙。谢谢。 我的代码:

  • 我使用Postgresql 9.1在Ireport 5.5.0中工作。我有一个bytea类型的图像字段。我想在IReport中打印这个字段,我已经在谷歌上搜索了两天,但我找不到任何解决方案。我已经尝试了所有可能的选择,但没有成功。请帮帮我,我陷在里面了。提前致谢

  • 使用ML Kit的图像标签API,您可以识别图像中的实体,而无需向设备上的API或基于云的API提供任何其他上下文元数据。 图像标签可让您深入了解图像的内容。当你使用API时,你会得到一个被识别的实体列表:人物,事物,地点,活动等等。出现的每个标签都带有一个分数,表示ML模型与其相关性的置信度。利用这些信息,您可以执行诸如自动元数据生成和内容审核等任务。 iOS Android 在设备上的API和

  • 问题内容: 我正在尝试使用以下代码将Icon()转换为Image(): 问题是,函数在上抛出。 对于记录,该值为默认图标(通过获取) 以下是引发异常的详细信息: 如果您需要更多详细信息,请告诉我,我将编辑我的信息以添加它们。 谢谢! 问题答案: 刚刚找到了一个代码段,如果您想更频繁地包装那些表现不佳的LAF提供的图标,可能会有所帮助: 要在您的代码段中使用,只需传递任意组件:

  • 我编写了以下简单的C#控制台应用程序,用于从Excel工作簿导出所有图表。它工作正常,除非打开文档后图表没有滚动到,在这种情况下会生成一个空的图像文件。 我尝试了几次滚动到该对象的失败尝试;程序底部注释掉的行(