0

私は使用しています:SmartGwt 3.0; gwt 2.4; Firefox 11 および Google Chrome 19.0.1084.52。

まず、私の英語がとても下手なので、謝りたいと思います。必要なのは、リストグリッドのセル内にコンポーネント (ラベル、画像など) をドラッグ アンド ドロップすることです。レコードをドラッグできることはわかっていますが、セル内に任意のタイプのコンポーネントを追加したいと考えています。それ以外の場合は、セル内にコンポーネントを追加できる大量のプロパティリストグリッドを持つテーブルコンポーネントを作成するためにプレイするため、どんなに小さな助けでも感謝します。そして、真実は問題に対処することではありません。

smartgwt の最新バージョンを使用しています

メソッド「getShowRecordComponents」、「getShowRecordComponentsByCell」、「WillAcceptDrop」、および「CreateRecordComponent」を試しています。コンポーネント smartgwt をドラッグ アンド ドロップする必要があります (以前の構成を介して) が、レコードの最後に Arreaga があり、コンポーネントをドロップする列と行に配置する必要があります。

このクラスは、他のクラス内で呼び出されます。

private class CustomList extends ListGrid{
    //record que hace el drop
    private ListGridRecord currentRecord = null;
    //elemento que se va a dropear
    private Canvas currentCanvas = null;

    //private int index;

public CustomList() {
    this.setHeight(400);
    this.setWidth(400);
    this.setCanResizeFields(true);
    this.setResizeFieldsInRealTime(true);
    this.setShowRecordComponentsByCell(true);
    this.setShowRecordComponents(true);      
    this.setCanAcceptDrop(true);          

    this.addRecordDropHandler(new RecordDropHandler() {

      @Override
      public void onRecordDrop(RecordDropEvent event) {
          System.out.println("X: " + event.getX());
          System.out.println("Y: " + event.getY());
          System.out.println("index: " + event.getIndex());
          System.out.println("event.getDropRecords() ==>  "+ event.getDropRecords());
          //guardamo el record y el canvas que se hace el drop
          currentRecord = event.getTargetRecord();
          currentCanvas = EventHandler.getDragTarget();
       }
     });
    //defino columna ico
    ListGridField field = new ListGridField("icon");
    ListGridField field2 = new ListGridField("valor");
    this.setFields(field, field2);

    //añado record para poder aceptar drops
    ListGridRecord record = new ListGridRecord();
    ListGridRecord record2 = new ListGridRecord();
    record.setCanAcceptDrop(true);
    record.setAttribute("icon", "Hola"); 
    record.setAttribute("valor", "adios");
    record2.setAttribute("icon", "Segundo"); 
    record2.setAttribute("valor", "Segundo Adios");
    this.addData(record);
    this.addData(record2);
  }

  //la llamada a createRecordComponent la hace el listgrid al crearse.
  @Override
  protected Canvas createRecordComponent (ListGridRecord record, Integer colNum) {

    System.out.println("record: " + record);
    System.out.println("colNum: " + colNum);
    System.out.println("currentRecord: " + currentRecord);

    if (record.equals(currentRecord)) {
      System.out.println("createRecordComponent - REGRESARA: " + currentCanvas);

      return currentCanvas;
    }

    return null;
  }

  @Override
  public Boolean willAcceptDrop(){
    return true;
  }

  @Override
  public Canvas updateRecordComponent (ListGridRecord record, Integer colNum, Canvas component, boolean recordChange) {
    System.out.println("***************************************************************************************");
    System.out.println("Estoy en gridView");
    System.out.println("***************************************************************************************");
    System.out.println("record es : "+record);
    System.out.println("colNum es : "+colNum);
    System.out.println("component es : "+component);
    System.out.println("recordChange es :"+recordChange);
   System.out.println("***************************************************************************************");
    return component;
  }
}

手伝って頂けますか??

4

1 に答える 1

0

私は調査を続け、リストグリッドのセル内に他のウィジェットを挿入することができましたが、まったく構成できなかったため、正しい方法を知っている人に助けを求めました。1.- SmartGWT バージョン:

SmartClient バージョン: SC_SNAPSHOT-2011-12-05/LGPL 開発のみ (ビルド 2011-12-05)

2.- ブラウザのバージョン:

VersGoogle Chrome 19.0.1084.52 m および Firefox 11.0

3.- 問題: true に設定されている場合、この listGrid は、グリッドのすべての行に埋め込みコンポーネントを作成して表示する必要があります。この機能を使用する開発者は、ListGrid.createRecordComponent および ListGrid.updateRecordComponent メソッドを「updateRecordComponent」メソッドに実装する必要がありますが、このメソッドは、「createRecordComponent」から呼び出すという理由だけで呼び出されます。なぜこの動作ですか?

「createRecordComponent」メソッドを実行するたびに新しい行が作成されるのはなぜですか? セルリストグリッド内にドロップしたいだけです

4.- コード:

private class CustomList extends ListGrid{
    //record que hace el drop
    private ListGridRecord currentRecord = null;
    private ListGridRecord[] listRecord;
    //elemento que se va a dropear
    private Canvas currentCanvas = null;
    private EmbeddedPosition position;
//posiciones offset respecto a diferentes indices.
    private int x, x1, x2;
    private int y, y1, y2;      
    private int col, fil;


  public CustomList() {
    this.setHeight(400);
    this.setWidth(400); 
    this.setCanResizeFields(true);
    this.setResizeFieldsInRealTime(true);
    this.setRecordComponentPoolingMode(RecordComponentPoolingMode.RECYCLE);
    this.setRecordComponentPosition(EmbeddedPosition.EXPAND);
    this.setCanResizeFields(true);
    this.setShowRecordComponentsByCell(true);
    this.setShowRecordComponents(true);      
    this.setCanAcceptDrop(true);
    this.setCanReorderRecords(true);
    this.setCanAcceptDroppedRecords(true);
    this.setCanDrop(true);
   
    this.addRecordDropHandler(new RecordDropHandler() {
    
    @Override
    public void onRecordDrop(RecordDropEvent event) {
      //guardamo el record y el canvas que se hace el drop
      listRecord = event.getDropRecords();          
      currentRecord = event.getTargetRecord();
      currentCanvas = EventHandler.getDragTarget();
      position = getRecordComponentPosition();          
      x=event.getX();
      y=event.getY();          
      col=getEventColumn();
      fil=getEventRow();         
    }
  });
  
  //defino columna ico y valor
  ListGridField field = new ListGridField("icon");
  ListGridField field2 = new ListGridField("valor");
  this.setFields(field, field2);
  
  //añado record para poder aceptar drops
  ListGridRecord record = new ListGridRecord();
  ListGridRecord record2 = new ListGridRecord();
  record.setCanAcceptDrop(true);
  record.setAttribute("icon", "Hola"); 
  record.setAttribute("valor", "adios");
  record2.setAttribute("icon", "Segundo"); 
  record2.setAttribute("valor", "Segundo Adios");
  this.addData(record);
  this.addData(record2);
}

//la llamada createRecordComponent ,debería hacersela al crearse.
@Override
protected Canvas createRecordComponent (ListGridRecord record, Integer colNum) {
//como comprueba, porque setShowRecordComponentsByCell está a true, celda por celda, me quedo para actualizar solo cuando coincide
//la fila y la columna en la que he hecho el drop.
  if (record.equals(currentRecord) && (colNum.equals(col))) {
    updateRecordComponent(currentRecord,colNum,currentCanvas, true);
  }
  return null;
}

@Override
public Boolean willAcceptDrop(){
  return true;
}

@Override
public Canvas updateRecordComponent (ListGridRecord record, Integer colNum, Canvas component, boolean recordChange) {
  x1=this.getAbsoluteLeft();
  y1=this.getAbsoluteTop();
  x2 = component.getAbsoluteLeft();
  y2 = component.getAbsoluteTop();
  //currentCanvas.setSnapTo("C");
  addEmbeddedComponent(component, record, fil, colNum, EmbeddedPosition.WITHIN);      
  
  return component;
}

}

于 2012-05-30T15:35:14.077 に答える