2010-12-30 13 views
17

Verilerin yanı sıra kullanıcının girdiği verileri görüntüleyen bir tabloya sahip olmaya çalışıyorum. Bunu metinle nasıl yapacağımı anladım (yani, tablodaki bir şeyin adını düzenleyebilirler), ancak seçim hücresiyle çalışmasını sağlayamıyorum.GWT'yi kullanarak bir SelectionCell'deki seçenekleri dinamik olarak nasıl güncellerim?

Seçim hücresindeki öğeler önceden tanımlanmışsa doğru çalışır, ancak hücreyi oluşturduktan sonra yeni öğeler eklemek için hücredeki öğeleri dinamik olarak güncelleştiremiyorum.

Daha fazla bilgi için bir "type" sütunu kullanıyorum. Kullanıcı öğeleri belirli bir türle tabloya girer, ancak bu daha sonra yeni türler de ekleyebilir. Tür sütununda öğeyi tıkladıklarında, açılan kutunun girmiş oldukları tüm yeni türleri içermesini istiyorum, ancak bunu nasıl yapacağımı bilmiyorum.

Şimdiye kadar sahip olduğum kod şu ki (bunu istediğim gibi güncellemiyor). Kullanıcı yeni türler girdikten sonra record.getTypeList() ek girişleri içerecektir.

SelectionCell editTypeComboBox = new SelectionCell(record.getTypeList()); 

    Column<Assignment, String> typeColumn = new Column<Assignment, String>(editTypeComboBox) { 
     @Override 
     public String getValue(Assignment object) { 
      return object.getType(); 
     } 
    }; 
    typeColumn.setFieldUpdater(new FieldUpdater<Assignment, String>() { 

     @Override 
     public void update(int index, Assignment object, String value) { 
      int row = index; 
      String newType = value; 
      record.editAssignType(row, newType); 
      updateClassGradeLabel(); 
      log.info("Set type to " 
        + value); 
      cellTable.redraw(); 
     } 
    }); 

    cellTable.addColumn(typeColumn, "Type"); 

Düzenleme: bana bu anlamaya yardımcı Peter Knego düşmanı için teşekkürler. İşte değiştirilmiş DynamicSelectionCell sınıf ise kimse ilgi ise:

/* 
* Copyright 2010 Google Inc. 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); you may not 
* use this file except in compliance with the License. You may obtain a copy of 
* the License at 
* 
* http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
* License for the specific language governing permissions and limitations under 
* the License. 
*/ 
package com.google.gwt.cell.client; 

import com.google.gwt.core.client.GWT; 
import com.google.gwt.dom.client.Element; 
import com.google.gwt.dom.client.NativeEvent; 
import com.google.gwt.dom.client.SelectElement; 
import com.google.gwt.safehtml.client.SafeHtmlTemplates; 
import com.google.gwt.safehtml.shared.SafeHtml; 
import com.google.gwt.safehtml.shared.SafeHtmlBuilder; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

/** 
* A {@link Cell} used to render a drop-down list. 
*/ 
public class DynamicSelectionCell extends AbstractInputCell<String, String> { 

    interface Template extends SafeHtmlTemplates { 
    @Template("<option value=\"{0}\">{0}</option>") 
    SafeHtml deselected(String option); 

    @Template("<option value=\"{0}\" selected=\"selected\">{0}</option>") 
    SafeHtml selected(String option); 
    } 

    private static Template template; 

    private HashMap<String, Integer> indexForOption = new HashMap<String, Integer>(); 

    private final List<String> options; 

    /** 
    * Construct a new {@link SelectionCell} with the specified options. 
    * 
    * @param options the options in the cell 
    */ 
    public DynamicSelectionCell(List<String> options) { 
    super("change"); 
    if (template == null) { 
     template = GWT.create(Template.class); 
    } 
    this.options = new ArrayList<String>(options); 
    int index = 0; 
    for (String option : options) { 
     indexForOption.put(option, index++); 
    } 
    } 

    public void addOption(String newOp){ 
     String option = new String(newOp); 
     options.add(option); 
     refreshIndexes(); 
    } 

    public void removeOption(String op){ 
     String option = new String(op); 
     options.remove(indexForOption.get(option)); 
     refreshIndexes(); 
    } 

    private void refreshIndexes(){ 
     int index = 0; 
     for (String option : options) { 
      indexForOption.put(option, index++); 
     } 
    } 

    @Override 
    public void onBrowserEvent(Context context, Element parent, String value, 
     NativeEvent event, ValueUpdater<String> valueUpdater) { 
    super.onBrowserEvent(context, parent, value, event, valueUpdater); 
    String type = event.getType(); 
    if ("change".equals(type)) { 
     Object key = context.getKey(); 
     SelectElement select = parent.getFirstChild().cast(); 
     String newValue = options.get(select.getSelectedIndex()); 
     setViewData(key, newValue); 
     finishEditing(parent, newValue, key, valueUpdater); 
     if (valueUpdater != null) { 
     valueUpdater.update(newValue); 
     } 
    } 
    } 

    @Override 
    public void render(Context context, String value, SafeHtmlBuilder sb) { 
    // Get the view data. 
    Object key = context.getKey(); 
    String viewData = getViewData(key); 
    if (viewData != null && viewData.equals(value)) { 
     clearViewData(key); 
     viewData = null; 
    } 

    int selectedIndex = getSelectedIndex(viewData == null ? value : viewData); 
    sb.appendHtmlConstant("<select tabindex=\"-1\">"); 
    int index = 0; 
    for (String option : options) { 
     if (index++ == selectedIndex) { 
     sb.append(template.selected(option)); 
     } else { 
     sb.append(template.deselected(option)); 
     } 
    } 
    sb.appendHtmlConstant("</select>"); 
    } 

    private int getSelectedIndex(String value) { 
    Integer index = indexForOption.get(value); 
    if (index == null) { 
     return -1; 
    } 
    return index.intValue(); 
    } 
} 

cevap

11

Maalesef SelectionCell depolar özel Listesinde seçenekleri ve yapıcı bunları ayarladıktan sonra bu işlemek için hiçbir yöntem vardır.

Neyse ki, SelectionCell oldukça basit bir sınıftır. Sadece kendi (yeniden adlandırılmış) kopyanızı yapın ve List<String> options'u değiştirmek için addOption(..)/removeOption(..) yöntemlerini ekleyin.

+0

Bu fikri beğeniyorum, ancak yeni sınıf çalışmasını yapmak için doğru sınıfları içe aktarmada sorun yaşıyorum. SelectionCell sınıfını kopyaladım ve onu DynamicSelectionCell olarak değiştirdim, ancak render ve onBrowserEvent yöntemleri geçersiz kılmaları gerekmediğinden şikayet ediyor (onBrowserEvent öğesinin uygulanmasına gerek olmadığını söylerken, farklı parametrelerle uygulanması gerekenleri sorar) . Ayrıca, hangi "Bağlam" sınıfının içe aktarılacağından emin değilim. Buradan nereye gideceğinden emin değilim, tavsiye var mı? –

+0

Hangi GWT sürümünü kullanıyorsunuz? Sizi yönlendirdiğim sınıf bagajdan. İşte 2.1.1 sürümü: http://code.google.com/p/google-web-toolkit/source/browse/tags/2.1.1/user/src/com/google/gwt/cell/client/ SelectionCell.java?r=9485 –

+0

Sürümümü kontrol ettim ve hala 2.1.0 çalışıyordum. 2.1.1'e yükselttikten sonra sorun ortadan kalktı. Her şey şu an istediğim şekilde çalışıyor. Yardım için teşekkürler. –

İlgili konular