2017-11-28 3 views
1

を無視しますDefaultTableModelのほぼコピー(プライベートフィールドへのアクセスが必要)。数週間前にすべてうまくいっていた。表createCellは私が更新を起動する前に、私のアプリをテストしていたと私は私は本当に理解していない何かを発見した1列

オーバーライドされたメソッドcreateCellでは、現在の2番目の列は無視されます。メソッドの最初に値、行および列を表示するログを入れました。列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 ***[email protected] 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 ***[email protected] true 

ログの助けを借りて私は、列1が列タイトルを作成するときにのみcreateCellメソッドをトリガすることを確認しました。

+0

を私はあなたがこの特定のセルのためにそれを設定した後UIIDが変更された –

+0

問題は、テーブルをテーマ設定については、実際にはない推測していますQuitセルは 'Textfield'ではなくヌルになっています。これらのセルに対してcreateCellはまったく呼び出されません。それは私が理解できないものです。 –

答えて

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; 
} 
+0

こんにちはシャイ、私は質問の方法の最初に生成されたログを追加しました、私は最初から、すみませんでした、すみません。私は、セルのコンポーネントがヌルであることを知っています。たとえ値ではないとしても、後でコード内でデータを保存すると、セルの新しい値を取得しようとし、セルがヌルであるためNPEに遭遇します。 –

+0

セルの値がnullである可能性がありますが、セルのコンポーネントは決してなりません。あなたのelse文の一番下にあるBTWでは、 "label" UIID(小文字のl?)でスパンラベルを作成します。それは理由だろうか?デバッガを実行して、正しいラベルが作成されていることを確認しましたか?セルの値がnullで、UIIDが正しい場合は、上記の答えが有効になるはずです –

+0

私はテーブルの初期化後にロガーを追加して、テーブルの各セルを確実に記録し、セル実際にはnullですが、値はnullではありませんが、セルコンポーネントはnullです。小文字の「ラベル」UIIDの場合、メソッドの編集中は間違いです。 –

関連する問題

 関連する問題