奇怪的 primefaces 单杠行为

Strange primefaces horizontal bar behaviour

我需要你的帮助来理解一个非常奇怪的 primefaces 水平条行为。

我想做的是用素数画一个单杠。

这是我从我的 postgresql 数据库中得到的所有数据 table:

以下解释请参考这张horbarchart图片:

如果我从我的数据库中只得到前五个银行,一切都很好! (1)

如果我尝试获取并显示所有银行,灾难就会发生 :( 只显示了八个银行并且值发生了变化。(2)

最后,如果我尝试获取并显示最后四个银行,则只有两个显示的值错误。 (3)

显然,我检查了我的调试器 IDE 是否每个图表系列都正确填充并且一切都以非常正确的方式构建。

这是我的(休眠)class 从数据库获取数据:

public class ChartRequestTypeJPA {
static final transient Logger LOGGER = LogManager.getLogger(ChartRequestTypeJPA.class.getName());
static final transient ResourceBundle BUNDLE = FacesContext.getCurrentInstance().getApplication().getResourceBundle(FacesContext.getCurrentInstance(), "txt");

public List<ChartRequestType> getAll(TimeInterval step) throws Exception { 
    Session session = null;

    try {
        session = HibernateUtil.getSessionFactory().openSession();

        Criteria criteria = session
                .createCriteria(ChartRequestType.class)
                .add(Restrictions.eq("pk.step", step.getDescr()));
        List<ChartRequestType> result = criteria.list();

        return result;
    } catch (Exception e) {
        e.printStackTrace();
        LOGGER.error("Error getting chart request type" + e.getMessage());
        throw new DMLException(BUNDLE.getString("message.noDataFound"));
    } finally {
        if (session != null) {
            session.close();
        }
    }
}
}

这是我设置条形图模型的class:

@ManagedBean
@RequestScoped
public class Chart11RequestTypeView {  
    private HorizontalBarChartModel chartRequestTypeModel;

    private void createHorizontalBarModel() {
    chartRequestTypeModel = new HorizontalBarChartModel();

    ChartSeries informazioni = new ChartSeries();
    ChartSeries anomalia = new ChartSeries();
    ChartSeries rio = new ChartSeries();        

    // Valori percentuali della singola banca sul totale letto da oracle
    informazioni.setLabel(TXT.getString("uilabel.chart11.informazioni"));
    anomalia.setLabel(TXT.getString("uilabel.chart11.anomalia"));
    rio.setLabel(TXT.getString("uilabel.chart11.rio"));
    int size = chartRequestType.size();   

    for (int i = 0; i < size; i++) {
        String tipologia = chartRequestType.get(i).getPk().getTipologia();
        String bankName = chartRequestType.get(i).getPk().getName();
        int tickNumb = chartRequestType.get(i).getTicketnumber();

        switch(tipologia){
            case "Anomalia":{
                anomalia.set(bankName, (int) tickNumb);
                break;
            }
            case "Informazioni":{
                informazioni.set(bankName, (int) tickNumb);

                break;
            }
            case "Richiesta Operativa":{
                rio.set(bankName, (int)tickNumb);

                break;
            }
        }

        if(chartRequestType.get(i).getPk().getTipologia().equals("Informazioni")){
            informazioni.set(chartRequestType.get(i).getPk().getName(), chartRequestType.get(i).getTicketnumber());
        }
        if(chartRequestType.get(i).getPk().getTipologia().equals("Anomalia")){
            anomalia.set(chartRequestType.get(i).getPk().getName(), chartRequestType.get(i).getTicketnumber());
        }
        if(chartRequestType.get(i).getPk().getTipologia().equals("Richiesta Operativa")){
            rio.set(chartRequestType.get(i).getPk().getName(), chartRequestType.get(i).getTicketnumber());
        }
    }

    chartRequestTypeModel.setSeriesColors("999999,666666,333333");
    chartRequestTypeModel.setTitle(TXT.getString("uilabel.chart11.title"));

    chartRequestTypeModel.addSeries(anomalia);
    chartRequestTypeModel.addSeries(informazioni);
    chartRequestTypeModel.addSeries(rio);

    Axis xAxis = chartRequestTypeModel.getAxis(AxisType.X);
    xAxis.setLabel(TXT.getString("uilabel.chart11.number"));
    xAxis.setMin(0);
    xAxis.setTickAngle(40);
    xAxis.setTickFormat("%d");

    chartRequestTypeModel.setExtender("chartRequestTypeExtender");
    // horizontalBarModel.setShowPointLabels(true); qui non serve, sta nell'extender
}

}

最后,这是我的 xhtml:

<p:panel style="text-align: center; width:100%; border: 0px;">
    <p:panelGrid id="pchart11" columns="1" style="text-align: center; margin-bottom:10px; width: 100%; height:600px;">
        <p:row>
            <p:chart type="bar" model="#{chart11RequestTypeView.chartRequestTypeModel}" style="height:600px;" />
        </p:row>
    </p:panelGrid>
</p:panel>
<script language="javascript" type="text/javascript">
    function chartRequestTypeExtender() {
        this.cfg.sortData = true; // forse superfluo
        this.cfg.legend = {
            show: true,
            location: 'e',
            placement: 'insideGrid'
        };
        this.cfg.grid = {
            background: 'transparent',
            gridLineColor: '#D0D0FF',
            drawBorder: false
        };
        this.cfg.seriesDefaults = {
            renderer:$.jqplot.BarRenderer,
        // Show point labels to the right ('e'ast) of each bar.
        // edgeTolerance of -15 allows labels flow outside the grid
        // up to 15 pixels.  If they flow out more than that, they 
        // will be hidden.
            pointLabels: { show: true, location: 'e', edgeTolerance: -15 },
        // Rotate the bar shadow as if bar is lit from top right.
            shadowAngle: 135,
        // Here's where we tell the chart it is oriented horizontally.
            rendererOptions: {
                barDirection: 'horizontal'
            }
    };
    this.cfg.highlighter = {
            show: true,
            tooltipAxes: 'x', // da usare anche in altri chart, evita l'ambiguita dei tootips tipo 3,7 inteso come 3.7 anzichè valore 7 per il punto 3
            useAxesFormatters: false,
            tooltipFormatString: "%i"};
}
</script> 
</html>

谁能帮帮我? 非常感谢你听我说

已解决!

Primefaces 条形图需要每个 ChartSeries 具有相同数量的值才能正确设置它们的格式。我为每家银行用不同数量的值填充了我的三个系列;这就是问题所在!

因此,请注意用相同数量的值填充每个 ChartSeries。

享受吧! :)