表createCell忽略一列

时间:2017-11-28 15:47:03

标签: codenameone

我在发布更新之前测试了我的应用,发现了一些我真正不了解的内容:

我的一个表单包括一个带有纵切效果的可编辑Table和一个自定义TableModel,它几​​乎是DefaultTableModel的副本(需要访问私有字段)。几周前一切都很好。

现在我的第二列被createCell覆盖的方法忽略了。我在方法的开头放了一个日志,显示了值,行和列,第1列只在构建列标题时触发了它。所有其他列都会触发日志,但不会触发列1。

是否有任何可能导致此行为的想法?

提前致谢。

The culprit column is Qtty

编辑:这是覆盖的createCell代码:

@Override
protected Component createCell(Object value, int row, int column, boolean editable) {
    Component cell;
    Log.p("Table CreateCell "+ row + " " + column + " " + value + " " + editable);

    if(editable && (column == 1 || column == 2 || column == 3) && row != -1) 
    {
        //Table is editable
        Component TA = new TextArea(value.toString());
        TA.setUIID(CerebroMobileTheme.LABEL);
        ((TextArea)TA).setEditable(DocFormLineTable.this.editable);
        TA.setEnabled(DocFormLineTable.this.editable);
        if(column == 1) //Quantity cells
            ((TextArea)TA).setHint("Qtty");
        if(column == 2) //Description cells
            ((TextArea)TA).setHint("Description");
        if(column == 3)
        {
            //Third columns cells are confirm buttons
            TA = new Button("");
            TA.setUIID("BlueButton");
            FontImage.setMaterialIcon((Button)TA, FontImage.MATERIAL_CHECK);
            ((Button)TA).addActionListener(e-> {
                //Similar code is used at the closing of the form to save data
                //DocFormLine is a line of data for our document
                DocFormLine dfl = (DocFormLine)value;
                dfl.setDescription(((TextArea)((TableLayout)this.getLayout()).getComponentAt(row+1, 2)).getText());
                dfl.setQtty(Double.parseDouble(((TextArea)((TableLayout)this.getLayout()).getComponentAt(row+1, 1)).getText()));
                //Call our rest service to save the data serverside
                RestManager.saveDocFormLine(dfl);
            });
        }
        cell = TA;

    } 
    else 
    {
        //If non editable or title or first columns(non editable field), cell set to a SpanLabel
        cell = new SpanLabel((String)value);
        cell.setUIID("label");
        if(column == 3)
            cell = new Label("");
    }
}

以下是创建表的日志结果:

[EDT] 0:0:21,387 - Table CreateCell -1 0 Produit false
[EDT] 0:0:21,388 - Table CreateCell -1 1 Qtty false
[EDT] 0:0:21,388 - Table CreateCell -1 2 Utilisation false
[EDT] 0:0:21,388 - Table CreateCell -1 3  false
[EDT] 0:0:21,388 - Table CreateCell 0 0 Main d'oeuvre et déplacements true
[EDT] 0:0:21,388 - Table CreateCell 0 2  true
[EDT] 0:0:21,388 - Table CreateCell 0 3 ***.entities.DocFormLine@6ac641c6 true
[EDT] 0:0:21,391 - Table CreateCell 1 0 Main d'oeuvre et déplacements true
[EDT] 0:0:21,391 - Table CreateCell 1 2  true
[EDT] 0:0:21,391 - Table CreateCell 1 3 ***.entities.DocFormLine@69cdb35a true

在Log的帮助下,我确定第1列只在创建列标题时触发createCell方法。

1 个答案:

答案 0 :(得分:0)

如果值为null,我没有看到任何阻止创建单元格的代码。但也许它会创建一个空白标签然后隐藏。尝试做这样的事情:

protected Component createCell(Object value, int row, int column, boolean editable) {        
    // initialize the cell... all of your current code

    if(cell instanceof Label) {
        ((Label)cell).setShowEvenIfBlank(true);
    }
    return cell;
}