学无止境  
日历
<2005年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910
统计
  • 随笔 - 9
  • 文章 - 0
  • 评论 - 2
  • 引用 - 0

导航

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
To create a viewer in SWT is not a simple task. These are steps that will be described:
1. Identify the input.
2. Create the viewer.
3. Create a content provider.
4. Create a label provider.
5. Connect the viewer with the content and label providers.
6. Define an input to the viewer.
7. Implement model-viewer synchronization.


Here is an example.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColorCellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

/**
 * This class demonstrates CellEditors. It allows you to create and edit Person
 * objects
 */
public class PersonEditor extends ApplicationWindow {
  // Table column names/properties
  public static final String NAME = "Name";

  public static final String MALE = "Male?";

  public static final String AGE = "Age Range";

  public static final String SHIRT_COLOR = "Shirt Color";

  public static final String[] PROPS = NAME, MALE, AGE, SHIRT_COLOR };

  // The data model
  private java.util.List people;

  /**
   * Constructs a PersonEditor
   */
  public PersonEditor() {
    super(null);
    people = new ArrayList();
  }

  /**
   * Runs the application
   */
  public void run() {
    // Don't return from open() until window closes
    setBlockOnOpen(true);

    // Open the main window
    open();

    // Dispose the display
    Display.getCurrent().dispose();
  }

  /**
   * Configures the shell
   
   @param shell
   *            the shell
   */
  protected void configureShell(Shell shell) {
    super.configureShell(shell);
    shell.setText("Person Editor");
    shell.setSize(400400);
  }

  /**
   * Creates the main window's contents
   
   @param parent
   *            the main window
   @return Control
   */
  protected Control createContents(Composite parent) {
    Composite composite = new Composite(parent, SWT.NONE);
    composite.setLayout(new GridLayout(1false));

    // Add a button to create the new person
    Button newPerson = new Button(composite, SWT.PUSH);
    newPerson.setText("Create New Person");

    // Add the TableViewer
    final TableViewer tv = new TableViewer(composite, SWT.FULL_SELECTION);
    tv.setContentProvider(new PersonContentProvider());
    tv.setLabelProvider(new PersonLabelProvider());
    tv.setInput(people);

    // Set up the table
    Table table = tv.getTable();
    table.setLayoutData(new GridData(GridData.FILL_BOTH));

    new TableColumn(table, SWT.CENTER).setText(NAME);
    new TableColumn(table, SWT.CENTER).setText(MALE);
    new TableColumn(table, SWT.CENTER).setText(AGE);
    new TableColumn(table, SWT.CENTER).setText(SHIRT_COLOR);

    for (int i = 0, n = table.getColumnCount(); i < n; i++) {
      table.getColumn(i).pack();
    }

    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    // Add a new person when the user clicks button
    newPerson.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        Person p = new Person();
        p.setName("Name");
        p.setMale(true);
        p.setAgeRange(Integer.valueOf("0"));
        p.setShirtColor(new RGB(25500));
        people.add(p);
        tv.refresh();
      }
    });

    // Create the cell editors
    CellEditor[] editors = new CellEditor[4];
    editors[0new TextCellEditor(table);
    editors[1new CheckboxCellEditor(table);
    editors[2new ComboBoxCellEditor(table, AgeRange.INSTANCES,
        SWT.READ_ONLY);
    editors[3new ColorCellEditor(table);

    // Set the editors, cell modifier, and column properties
    tv.setColumnProperties(PROPS);
    tv.setCellModifier(new PersonCellModifier(tv));
    tv.setCellEditors(editors);

    return composite;
  }

  /**
   * The application entry point
   
   @param args
   *            the command line arguments
   */
  public static void main(String[] args) {
    new PersonEditor().run();
  }
}

/**
 * This class provides the content for the person table
 */

class PersonContentProvider implements IStructuredContentProvider {
  /**
   * Returns the Person objects
   */
  public Object[] getElements(Object inputElement) {
    return ((ListinputElement).toArray();
  }

  /**
   * Disposes any created resources
   */
  public void dispose() {
    // Do nothing
  }

  /**
   * Called when the input changes
   */
  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    // Ignore
  }
}

/**
 * This class provides the content for the FoodList application
 */

class FoodContentProvider implements IStructuredContentProvider {
  /**
   * Gets the food items for the list
   
   @param arg0
   *            the data model
   @return Object[]
   */
  public Object[] getElements(Object arg0) {
    return ((GroceryListarg0).getFoods().toArray();
  }

  /**
   * Disposes any created resources
   */
  public void dispose() {
    // Do nothing
  }

  /**
   * Called when the input changes
   
   @param arg0
   *            the viewer
   @param arg1
   *            the old input
   @param arg2
   *            the new input
   */
  public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
    // Do nothing
  }
}

/**
 * This class represents the cell modifier for the PersonEditor program
 */

class PersonCellModifier implements ICellModifier {
  private Viewer viewer;

  public PersonCellModifier(Viewer viewer) {
    this.viewer = viewer;
  }

  /**
   * Returns whether the property can be modified
   
   @param element
   *            the element
   @param property
   *            the property
   @return boolean
   */
  public boolean canModify(Object element, String property) {
    // Allow editing of all values
    return true;
  }

  /**
   * Returns the value for the property
   
   @param element
   *            the element
   @param property
   *            the property
   @return Object
   */
  public Object getValue(Object element, String property) {
    Person p = (Personelement;
    if (PersonEditor.NAME.equals(property))
      return p.getName();
    else if (PersonEditor.MALE.equals(property))
      return Boolean.valueOf(p.isMale());
    else if (PersonEditor.AGE.equals(property))
      return p.getAgeRange();
    else if (PersonEditor.SHIRT_COLOR.equals(property))
      return p.getShirtColor();
    else
      return null;
  }

  /**
   * Modifies the element
   
   @param element
   *            the element
   @param property
   *            the property
   @param value
   *            the value
   */
  public void modify(Object element, String property, Object value) {
    if (element instanceof Item)
      element = ((Itemelement).getData();

    Person p = (Personelement;
    if (PersonEditor.NAME.equals(property))
      p.setName((Stringvalue);
    else if (PersonEditor.MALE.equals(property))
      p.setMale(((Booleanvalue).booleanValue());
    else if (PersonEditor.AGE.equals(property))
      p.setAgeRange((Integervalue);
    else if (PersonEditor.SHIRT_COLOR.equals(property))
      p.setShirtColor((RGBvalue);

    // Force the viewer to refresh
    viewer.refresh();
  }
}

/**
 * This class represents a person
 */

class Person {
  private String name;

  private boolean male;

  private Integer ageRange;

  private RGB shirtColor;

  /**
   @return Returns the ageRange.
   */
  public Integer getAgeRange() {
    return ageRange;
  }

  /**
   @param ageRange
   *            The ageRange to set.
   */
  public void setAgeRange(Integer ageRange) {
    this.ageRange = ageRange;
  }

  /**
   @return Returns the male.
   */
  public boolean isMale() {
    return male;
  }

  /**
   @param male
   *            The male to set.
   */
  public void setMale(boolean male) {
    this.male = male;
  }

  /**
   @return Returns the name.
   */
  public String getName() {
    return name;
  }

  /**
   @param name
   *            The name to set.
   */
  public void setName(String name) {
    this.name = name;
  }

  /**
   @return Returns the shirtColor.
   */
  public RGB getShirtColor() {
    return shirtColor;
  }

  /**
   @param shirtColor
   *            The shirtColor to set.
   */
  public void setShirtColor(RGB shirtColor) {
    this.shirtColor = shirtColor;
  }
}

/**
 * This class contains all the foods on the "grocery list"
 */

class GroceryList {
  // Holds the foods
  private List foods;

  /**
   * Constructs a grocery list
   */
  public GroceryList() {
    foods = new ArrayList();

    // Add some foods
    foods.add(new Food("Broccoli"true));
    foods.add(new Food("Bundt Cake"false));
    foods.add(new Food("Cabbage"true));
    foods.add(new Food("Candy Canes"false));
    foods.add(new Food("Eggs"true));
    foods.add(new Food("Potato Chips"false));
    foods.add(new Food("Milk"true));
    foods.add(new Food("Soda"false));
    foods.add(new Food("Chicken"true));
    foods.add(new Food("Cinnamon Rolls"false));
  }

  /**
   * Returns the foods in this grocery list
   
   @return List
   */
  public List getFoods() {
    return Collections.unmodifiableList(foods);
  }
}

/**
 * This class represents a type of food
 */

class Food {
  // The name of the food
  private String name;

  // Is it healthy?
  private boolean healthy;

  /**
   * Food constructor
   
   @param name
   *            the name
   @param healthy
   *            whether or not it's healthy
   */
  public Food(String name, boolean healthy) {
    this.name = name;
    this.healthy = healthy;
  }

  /**
   * Gets whether this is healthy
   
   @return boolean
   */
  public boolean isHealthy() {
    return healthy;
  }

  /**
   * Gets the name
   
   @return String
   */
  public String getName() {
    return name;
  }
}

/**
 * This class provides the labels for the person table
 */

class PersonLabelProvider implements ITableLabelProvider {
  /**
   * Returns the image
   
   @param element
   *            the element
   @param columnIndex
   *            the column index
   @return Image
   */
  public Image getColumnImage(Object element, int columnIndex) {
    return null;
  }

  /**
   * Returns the column text
   
   @param element
   *            the element
   @param columnIndex
   *            the column index
   @return String
   */
  public String getColumnText(Object element, int columnIndex) {
    Person person = (Personelement;
    switch (columnIndex) {
    case 0:
      return person.getName();
    case 1:
      return Boolean.toString(person.isMale());
    case 2:
      return AgeRange.INSTANCES[person.getAgeRange().intValue()];
    case 3:
      return person.getShirtColor().toString();
    }
    return null;
  }

  /**
   * Adds a listener
   
   @param listener
   *            the listener
   */
  public void addListener(ILabelProviderListener listener) {
    // Ignore it
  }

  /**
   * Disposes any created resources
   */
  public void dispose() {
    // Nothing to dispose
  }

  /**
   * Returns whether altering this property on this element will affect the
   * label
   
   @param element
   *            the element
   @param property
   *            the property
   @return boolean
   */
  public boolean isLabelProperty(Object element, String property) {
    return false;
  }

  /**
   * Removes a listener
   
   @param listener
   *            the listener
   */
  public void removeListener(ILabelProviderListener listener) {
    // Ignore
  }
}


/**
 * This class encapsulates age ranges
 */

class AgeRange {
  public static final String NONE = "";

  public static final String BABY = "0 - 3";

  public static final String TODDLER = "4 - 7";

  public static final String CHILD = "8 - 12";

  public static final String TEENAGER = "13 - 19";

  public static final String ADULT = "20 - ?";

  public static final String[] INSTANCES = NONE, BABY, TODDLER, CHILD,
      TEENAGER, ADULT };
}

To add a Checkbox into the table is another complicated task. The CheckboxCellEditor provides with the functionality but not the layout. That means you will just see true/false in the table. The only way to show check box itself is to use getColumnImage in LabelProvider class.

posted on 2005-08-29 16:39 lucia 阅读(3245) 评论(2)  编辑  收藏 所属分类: SWT
评论:
  • # re: SWT TableViewer  ken yang Posted @ 2006-08-18 03:55
    Great.
    However, the jface table seems having a flaw unless there is more could be done. Basically, your first column, the person's name, by default is not editable. To edit, you need to click it first. This is a problem: imagine that you need to type with both hands, then jot enter to keep the change, then click again to make more change, this is very inefficient for data entry. If you could make default as editable which means as soon as the cursor moves over to the cell, user could start typing and when hit return key, the change is made. Basically, no need for mouse.

    Can someone help?
    please contact kenqyang@yahoo.com if you do.

    thanks.  回复  更多评论   

  • # Wholesale swimwear + China swimwear manufacturer  Wholesale swimwear + China swimwear manufacturer Posted @ 2013-01-25 15:20
    If New Year comes, can summer be so far behind? Summer is the cool season for most women since they can wear bikini and sexy swimwear on seaside or swim pool. Take a glance on wholesale swimwear, you will find some suitable for your business. The good quality and fast worldwide shipping of Dear-Lover make it top China Swimwear Manufacturerand famous worldwide.   回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
相关文章:
 
 
Copyright © lucia Powered by: 博客园 模板提供:沪江博客