2011-05-09 10 views
4

저는 GWT 앱을 개발하고 있으며, 지금까지는 Java 개발자 친화적 인 UI 프레임 워크를 좋아합니다!GWT 동일한 열에 다른 열 유형이 있습니까?

지금까지 위젯을 사용하여 거의 모든 것을 할 수 있었지만이 하나가 저를 곤혹스럽게합니다. 사용자 입력 소스로 사용하는 셀 테이블이 있습니다. 사용자가 키 - 값 쌍을 입력하여 내 서비스에 전화 할 수있는 유일한 방법입니다. 사용자는 동적으로 행을 추가하고 행을 삭제할 수 있습니다.

이제 까다로운 부분은 사용자가 일부 키 값을 입력하도록하려는 것입니다. 이러한 키에는 특정 4-5 값을 사용할 수 있으므로 editableTextCell을 selectionCell로 바꾸려면 해당 행에 대해 선택하십시오. 테이블에 열을 추가하는 동안 열 셀 유형 선언이 완료되면 표 안에 셀 유형을 혼합 할 수 있는지 잘 모르겠습니다.

모든 의견을 환영합니다.

감사

답변

4

당신은 때때로 <select>을 렌더링하고 때로는 <input>를 렌더링하는 사용자 정의 셀을 만들어야합니다. EditableTextCell 및 SelectionCell의 코드를 보면이를 수행하는 방법에 대한 아이디어를 얻을 수 있습니다. 꽤 간단 할 수도 있습니다 - 각각 하나를 작성할 수도 있고, render 함수에서 데이터를 적절한 셀에 전달하기 만하면됩니다.

뭔가 같은 ...

public class ChoosyCell extends AbstractCell<YourData> { 
    SelectionCell selectCell = new SelectionCell<YourData>(); 
    EditableTextCell textCell = new EditableTextCell<YourData>(); 

    public void render(Context context, YourData data, SafeHtmlBuilder sb) { 
     if (data.isTheLimitedType()) { 
      selectCell.render(context, data, sb); 
     } else { 
      textCell.render(context,data, sb); 
     } 
    } 
} 

(테스트되지 않은 코드) 매우 유용

+0

흥미 롭 잘 나는 것 작동합니다 이것을 시도한 다음보고하십시오! – theboot

0

. 여기에 내 걸릴 조금 나중에 대답 조건부 렌더링 CheckboxCell

 import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.CheckboxCell; import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.EventTarget; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; /** * CheckboxCell that is conditionally rendered if the enclosing column's * Boolean com.google.gwt.user.cellview.client.Column.getValue(T object) method returns true. 
    */ 
    public class ConditionallyRenderedCheckboxCell extends AbstractCell { 

     public ConditionallyRenderedCheckboxCell() { 
     //We handle the same events as CheckboxCell 
     super("change", "keydown"); 
     } 

     private CheckboxCell cell = null; 

     @Override 
     public void render(Context context, Boolean renderCheckboxCell, SafeHtmlBuilder sb) { 
      if (renderCheckboxCell) {    
       this.cell = new CheckboxCell(false,true); 
       //Render the checkbox cell unchecked 
       this.cell.render(context, false, sb); 
      } 
     } 

     @Override 
     public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, 
      Element parent, Boolean value, NativeEvent event, 
      ValueUpdater valueUpdater) { 

     //If we have created a checkbox cell, do event handling, otherwise, ignore it. 
     if(this.cell != null){ 
      super.onBrowserEvent(context, parent, value, event, valueUpdater); 

      // Handle the change event. 
      if ("change".equals(event.getType())) { 

      // Ignore events that occur outside of the outermost element. 
      EventTarget eventTarget = event.getEventTarget(); 

      if (parent.isOrHasChild(Element.as(eventTarget))) { 

       // Use this to get the selected element!! 
       Element el = Element.as(eventTarget); 

       //Check if we really clicked on the checkbox 
       if (el.getNodeName().equalsIgnoreCase("input") && el.getPropertyString("type").equalsIgnoreCase("checkbox")) { 

       //If an value updater was defined, invoke it 
       if(valueUpdater != null) 
        valueUpdater.update(el.getPropertyBoolean("checked"));   
       } 
      } 
      } 
     } 
     }   
    } 

0

하지만 어떤 식 으로든에 있습니다. 며칠 전이 작업에도 직면했습니다. 셀 편집을 위해 텍스트 또는 콤보 상자를 하나의 열에서 사용해야합니다.

final GridInlineEditingTextOrCombo editing = new GridInlineEditingTextOrCombo(attributeTableGrid); 
    editing.addEditor(valueCol); 

그리고 사용자 정의 GridInlineEditing 구현이이과 같습니다 : 여기 내 구현입니다

/** 
* Class intended to create GridInlineEditing functionality, 
* but with two type of editors in one column - TextField or SimpleComboBox, 
* depending of SnmpParameterDefDTO.getAllowedValues(). 
*/ 
class GridInlineEditingTextOrCombo extends GridInlineEditing<SnmpParameterDefDTO> { 
    IsField<String> textField = new TextField(); 
    SimpleComboBox<String> simpleComboBox = new SimpleComboBox<String>(new StringLabelProvider<String>()); 
    Grid.GridCell currentCell = null; 
    private boolean currentCellChanged = false; 
    IsField<String> currentCellEditor; 
    //ComboBox<String> comboBox = new ComboBox<String>(); 

    public GridInlineEditingTextOrCombo(Grid<SnmpParameterDefDTO> editableGrid) { 
    super(editableGrid); 
    simpleComboBox.setEditable(false); 
    simpleComboBox.setAllowTextSelection(false); 
    simpleComboBox.setTriggerAction(ComboBoxCell.TriggerAction.ALL); 
    } 

    @Override 
    @SuppressWarnings("unchecked") 
    public <O> IsField<O> getEditor(ColumnConfig<SnmpParameterDefDTO, ?> columnConfig) { 
    IsField<O> field = super.getEditor(columnConfig); 
    if(field!=null){ 
     if(!currentCellChanged){ 
     return (IsField<O>)currentCellEditor; 
     }else{ 
     currentCellChanged = false; 
     SnmpParameterDefDTO param = this.editableGrid.getStore().get(this.currentCell.getRow()); 
     if(param.getAllowedValues() == null || param.getAllowedValues().size() == 0){ 
      currentCellEditor = (IsField<String>)field; 
     }else{ 
      simpleComboBox.getStore().clear(); 
      simpleComboBox.add(param.getAllowedValues()); 
      currentCellEditor = simpleComboBox; 
     } 
     return (IsField<O>)currentCellEditor; 
     } 
    } 
    return null; 
    } 

    @Override 
    public <T> void addEditor(ColumnConfig<SnmpParameterDefDTO, T> columnConfig, IsField<T> field) { 
    throw new RuntimeException("You can not call this method. Please use addEditor(ColumnConfig<SnmpParameterDefDTO, T> columnConfig) instead"); 
    } 

    public <T> void addEditor(ColumnConfig<SnmpParameterDefDTO, T> columnConfig) { 
    super.addEditor(columnConfig, (IsField<T>)textField); 
    } 

    @Override 
    public void startEditing(Grid.GridCell cell){ 
    currentCell = cell; 
    currentCellChanged = true; 
    super.startEditing(cell); 
    } 

그것은 오히려 해결 방법은없는 우아한 구현하지만, 어떤 방법, 그것은

관련 문제