欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实现可编辑的表格TableViewer

程序员文章站 2022-03-16 15:09:14
...
package com.soyatec;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;

public class TableViewerTest {
	private Shell shell;
	private Display display;
	private TableViewer viewer;
	private List<User> listValues = new ArrayList<User>(0);

	private TableViewerTest() {

		initListValue();

	}

	// 初始化数据
	private void initListValue() {
		User user = new User("唐僧", 58, 0, "湖南", true);
		listValues.add(user);
		user = new User("六小龄童", 38, 1, "湖北", false);
		listValues.add(user);
		user = new User("猪八戒", 18, 0, "河南", true);
		listValues.add(user);
		user = new User("沙悟净", 8, 1, "东北", false);
		listValues.add(user);
	}

	public static void main(String[] args) {
		new TableViewerTest().createTableViewer();
	}

	// 构建表格
	private void createTableViewer() {
		shell = new Shell();
		shell.setText("TableViewer");
		shell.setSize(500, 300);
		display = Display.getDefault();
		shell.setLayout(new GridLayout());
		Composite composite = new Composite(shell, SWT.NONE);
		GridLayoutFactory.swtDefaults().numColumns(1).applyTo(composite);
		GridDataFactory.fillDefaults().grab(true, true).applyTo(composite);
		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
		viewer = new TableViewer(composite, SWT.FULL_SELECTION);
		Table table = viewer.getTable();
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		table.setLayoutData(new GridData(GridData.FILL_BOTH));
		String[] heards = new String[] { "name", "age", "sex", "address",
				"select all" };
		for (int i = 0; i <= 4; i++) {
			TableViewerColumn column = new TableViewerColumn(viewer, SWT.LEFT);
			column.getColumn().setText(heards[i]);
			column.getColumn().setWidth(100);
			column.setEditingSupport(new TableViewerEditingSupport(viewer, i));
		}
		viewer.setLabelProvider(new TableLableProvider());
		viewer.setContentProvider(new TableContentProvider());
		viewer.setInput(listValues);
		shell.layout();
		shell.open();
		while (!shell.isDisposed())
			if (!display.readAndDispatch())
				display.sleep();
	}

	// 定义模型
	static class User {
		String name;
		int age;
		int sex;
		String address;
		boolean isSelected;

		public User(String name, int age, int sex, String address,
				boolean isSelected) {
			super();
			this.name = name;
			this.age = age;
			this.sex = sex;
			this.address = address;
			this.isSelected = isSelected;
		}

		public boolean isSelected() {
			return isSelected;
		}

		public void setSelected(boolean isSelected) {
			this.isSelected = isSelected;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public int getAge() {
			return age;
		}

		public void setAge(int age) {
			this.age = age;
		}

		public int getSex() {
			return sex;
		}

		public void setSex(int sex) {
			this.sex = sex;
		}

		public String getAddress() {
			return address;
		}

		public void setAddress(String address) {
			this.address = address;
		}
	}

	static class TableLableProvider extends LabelProvider implements
			ITableLabelProvider {
		final Image check = ImageDescriptor.createFromFile(
				TableViewerTest.class, "checked.gif").createImage();
		final Image uncheck = ImageDescriptor.createFromFile(
				TableViewerTest.class, "unchecked.gif").createImage();

		@Override
		public Image getColumnImage(Object element, int columnIndex) {
			User user = (User) element;
			if (columnIndex == 4)
				if (user.isSelected)
					return check;
				else
					return uncheck;
			return super.getImage(element);
		}

		@Override
		public String getColumnText(Object element, int columnIndex) {
			User user = (User) element;
			switch (columnIndex) {
			case 0:
				return user.getName();
			case 1:
				return String.valueOf(user.getAge());
			case 2:
				if (user.getSex() == 0)
					return "男";
				else
					return "女";
			case 3:
				return user.getAddress();
			case 4:
				return String.valueOf(user.isSelected());
			}
			return null;
		}

	}

	static class TableContentProvider implements IStructuredContentProvider {

		@Override
		public Object[] getElements(Object inputElement) {
			if (inputElement instanceof Collection<?>) {
				return ((Collection<?>) inputElement).toArray(new Object[0]);
			}
			return null;
		}

		@Override
		public void dispose() {
		}

		@Override
		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

		}
	}

	static class TableViewerEditingSupport extends EditingSupport {

		int column;
		private TableViewer columnViewer;
		private CellEditor editor;

		public TableViewerEditingSupport(ColumnViewer viewers, int column) {
			super(viewers);
			this.columnViewer = (TableViewer) viewers;
			switch (column) {
			case 0:
				editor = new TextCellEditor(columnViewer.getTable(), SWT.SINGLE
						| SWT.BORDER);
				break;
			case 1:
				editor = new TextCellEditor(columnViewer.getTable(), SWT.SINGLE
						| SWT.BORDER);
				break;

			case 2:
				editor = new ComboBoxCellEditor(columnViewer.getTable(),
						new String[] { "男", "女" }, SWT.READ_ONLY | SWT.SINGLE
								| SWT.BORDER);
				break;
			case 3:
				editor = new ComboBoxCellEditor(columnViewer.getTable(),
						new String[] { "湖南", "湖北", "河南", "东北" }, SWT.READ_ONLY
								| SWT.SINGLE | SWT.BORDER);
				break;
			case 4:
				editor = new CheckboxCellEditor(columnViewer.getTable(),
						SWT.SINGLE | SWT.CHECK);
				break;

			}
			this.column = column;
		}

		@Override
		protected boolean canEdit(Object element) {
			return true;
		}

		@Override
		protected CellEditor getCellEditor(Object element) {
			return editor;
		}

		@Override
		protected Object getValue(Object element) {
			User user = (User) element;
			switch (column) {
			case 0:
				return user.getName();
			case 1:
				return user.getAge() + "";
			case 2:
				if (user.getSex() == 0)
					return 0;
				else
					return 1;
			case 3:
				if (user.getAddress().equals("湖南"))
					return 0;
				else if (user.getAddress().equals("湖北"))
					return 1;
				else if (user.getAddress().equals("河南"))
					return 2;
				else
					return 3;
			case 4:
				return user.isSelected();
			}
			return null;
		}

		@Override
		protected void setValue(Object element, Object value) {
			User user = (User) element;
			switch (column) {
			case 0:
				user.setName(value.toString());
				break;
			case 1:
				user.setAge(Integer.parseInt(value.toString()));
				break;
			case 2:
				if (Integer.parseInt(value.toString()) == 0)
					user.setSex(0);
				else
					user.setSex(1);
				break;
			case 3:
				if (Integer.parseInt(value.toString()) == 0)
					user.setAddress("湖南");
				else if (Integer.parseInt(value.toString()) == 1)
					user.setAddress("湖北");
				else if (Integer.parseInt(value.toString()) == 2)
					user.setAddress("河南");
				else
					user.setAddress("东北");
				break;
			case 4:
				user.setSelected(Boolean.valueOf(value.toString()));
				break;
			}
			columnViewer.refresh(true);
		}
	}
}

 

相关标签: Eclipse