SWT Table示例

/*
 * 文件名:TableSample.java
 * 版权:Copyright 1986-2012 Andy. All Rights Reserved. 
 * 描述: TableSample.java
 * 修改人:Andy
 * 修改时间:2012-10-26
 * 修改内容:新增
 */
package org.wang.andy.swtjface.demo.table;

import java.util.Hashtable;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.ControlEditor;
import org.eclipse.swt.custom.TableCursor;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

/**
 * TODO 添加类的一句话简单描述。
 * <p>
 * TODO 详细描述
 * <p>
 * TODO 示例代码
 * 
 * <pre>
 * </pre>
 * 
 */

public class TableSample
{

    public class TableItemControls
    {
        Text text;

        CCombo combo;

        TableEditor tableeditor;

        TableEditor tableeditor1;

        public TableItemControls(Text text, CCombo combo,
                TableEditor tableeditor, TableEditor tableeditor1)
        {
            // super();
            this.text = text;
            this.combo = combo;
            this.tableeditor = tableeditor;
            this.tableeditor1 = tableeditor1;
        }

        public void dispose()
        {
            text.dispose();
            combo.dispose();
            tableeditor.dispose();
            tableeditor1.dispose();
        }
    };

    private Shell sShell = null; // @jve:decl-index=0:visual-constraint="10,10"

    private ViewForm viewForm = null;

    private ToolBar toolBar = null;

    private Composite composite = null;

    private Table table = null;

    private Menu menu = null;

    private Hashtable<TableItem, TableItemControls> tablecontrols = new Hashtable<TableItem, TableItemControls>();

    // 创建ViewForm面板放置工具栏和表格
    private void createViewForm()
    {
        viewForm = new ViewForm(sShell, SWT.NONE);
        // viewForm.setTopCenterSeparate(true);
        createToolBar();
        viewForm.setTopLeft(toolBar);
        createComposite();
        viewForm.setContent(composite);
    }

    // 创建工具栏
    private void createToolBar()
    {
        toolBar = new ToolBar(viewForm, SWT.FLAT);
        final ToolItem add = new ToolItem(toolBar, SWT.PUSH);
        add.setText("添加");
        add.setImage(new Image(toolBar.getDisplay(), "icons//add.gif"));
        final ToolItem del = new ToolItem(toolBar, SWT.PUSH);
        del.setText("删除");
        del.setImage(new Image(toolBar.getDisplay(), "icons//delete.gif"));
        final ToolItem back = new ToolItem(toolBar, SWT.PUSH);
        back.setText("上移");
        back.setImage(new Image(toolBar.getDisplay(), "icons//up.gif"));
        final ToolItem forward = new ToolItem(toolBar, SWT.PUSH);
        forward.setText("下移");
        forward.setImage(new Image(toolBar.getDisplay(), "icons//down.gif"));
        final ToolItem save = new ToolItem(toolBar, SWT.PUSH);
        save.setText("保存");
        save.setImage(new Image(toolBar.getDisplay(), "icons//save.gif"));
        // 工具栏按钮事件处理
        Listener listener = new Listener()
        {
            @Override
            public void handleEvent(Event event)
            {
                // 如果单击添加按钮,添加一行,在实际的项目实现中通常是接收输入的参数,案后添加
                // 这里为了简单起见,添加固定的一条记录
                if (event.widget == add)
                {
                    TableItem item = new TableItem(table, SWT.NONE);
                    item.setText(new String[]{"郑六", "女", "568", ""});
                }
                // 如果单击删除按钮
                else if (event.widget == del)
                {
                    // 首先获得表格中所有的行
                    TableItem[] items = table.getItems();
                    // 循环所有行
                    for (int i = items.length - 1; i >= 0; i--)
                    {
                        // 如果该行没有被选中,继续循环
                        if (!items[i].getChecked())
                            continue;
                        // 否则选中,查找该表格中是否有该行
                        int index = table.indexOf(items[i]);
                        // 如果没有该行,继续循环
                        if (index < 0)
                            continue;
                        // 删除绑定的控件
                        TableItemControls cons = tablecontrols
                                .get(items[index]);
                        if (cons != null)
                        {
                            cons.dispose();
                            tablecontrols.remove(items[index]);
                            System.out.println("dispose " + index);
                        }
                        // 如果有该行,删除该行
                        // items[index].dispose();
                        table.remove(index);
                        System.out.println("i=" + i + ", index=" + index);
                        System.out.println("行数:" + table.getItemCount());
                        // table.pack();
                    }
                }
                // 如果单击上移按钮
                else if (event.widget == back)
                {
                    int selectedRow = table.getSelectionIndex();
                    if (selectedRow > 0)
                        table.setSelection(selectedRow - 1);// 设置选中的行数
                }
                // 如果单击下移按钮
                else if (event.widget == forward)
                {
                    int selectedRow = table.getSelectionIndex();
                    if (selectedRow > -1
                            && selectedRow < table.getItemCount() - 1)
                        table.setSelection(selectedRow + 1);// 设置选中的行数
                }
                // 如果单击保存按钮
                else if (event.widget == save)
                {
                    TableItem[] items = table.getItems();
                    // 保存到文件或数据库中,数据持久化,这里省略
                    for (int i = 0; i < items.length; i++)
                        for (int j = 0; j < table.getColumnCount(); j++)
                            System.out.println(items[i].getText(j));
                }
            }

        };
        // 为工具栏的按钮注册事件
        add.addListener(SWT.Selection, listener);
        del.addListener(SWT.Selection, listener);
        back.addListener(SWT.Selection, listener);
        forward.addListener(SWT.Selection, listener);
        save.addListener(SWT.Selection, listener);
    }

    // 创建放置表格的面板
    private void createComposite()
    {
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 1;
        composite = new Composite(viewForm, SWT.NONE);
        composite.setLayout(gridLayout);
        createTable();
    }

    // 创建表格
    private void createTable()
    {
        // 表格布局
        GridData gridData = new org.eclipse.swt.layout.GridData();
        gridData.horizontalAlignment = SWT.FILL;
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.verticalAlignment = SWT.FILL;

        // 创建表格,使用SWT.FULL_SELECTION样式,可同时选中一行
        table = new Table(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.CHECK);
        table.setHeaderVisible(true);// 设置显示表头
        table.setLayoutData(gridData);// 设置表格布局
        table.setLinesVisible(true);// 设置显示表格线/*
        // 创建表头的字符串数组
        String[] tableHeader = {"姓名", "性别", "电话", "电子邮件"};
        for (int i = 0; i < tableHeader.length; i++)
        {
            TableColumn tableColumn = new TableColumn(table, SWT.NONE);
            tableColumn.setText(tableHeader[i]);
            // 设置表头可移动,默认为false
            tableColumn.setMoveable(true);
        }
        // 添加三行数据
        TableItem item = new TableItem(table, SWT.NONE);
        item.setText(new String[]{"张三", "男", "123", ""});
        // 设置图标
        // item.setImage( ImageFactory.loadImage(
        // table.getDisplay(),ImageFactory.ICON_BOY));

        for (int i = 0; i < 5; i++)
        {
            item = new TableItem(table, SWT.NONE);
            item.setText(new String[]{"李四", "男", "4582", ""});
        }
        // 设置图标
        // item.setImage( ImageFactory.loadImage(
        // table.getDisplay(),ImageFactory.ICON_BOY));

        item = new TableItem(table, SWT.NONE);
        item.setText(new String[]{"周五", "女", "567", ""});
        // 设置图标
        // item.setImage( ImageFactory.loadImage(
        // table.getDisplay(),ImageFactory.ICON_GIRL));

        // 添加可编辑的单元格
        // /******************************************************
        TableItem[] items = table.getItems();
        for (int i = 0; i < items.length; i++)
        {
            // 第一列设置,创建TableEditor对象
            final TableEditor editor = new TableEditor(table);
            // 创建一个文本框,用于输入文字
            final Text text = new Text(table, SWT.NONE);
            // 将文本框当前值,设置为表格中的值
            text.setText(items[i].getText(0));
            // 设置编辑单元格水平填充
            editor.grabHorizontal = true;
            // 关键方法,将编辑单元格与文本框绑定到表格的第一列
            editor.setEditor(text, items[i], 0);
            // 当文本框改变值时,注册文本框改变事件,该事件改变表格中的数据。
            // 否则即使改变的文本框的值,对表格中的数据也不会影响
            text.addModifyListener(new ModifyListener()
            {
                public void modifyText(ModifyEvent e)
                {
                    editor.getItem().setText(1, text.getText());
                }

            });
            // 同理,为第二列绑定下 拉框CCombo
            final TableEditor editor1 = new TableEditor(table);
            final CCombo combo = new CCombo(table, SWT.NONE);
            combo.add("男");
            combo.add("女");
            combo.setText(items[i].getText(1));
            editor1.grabHorizontal = true;
            editor1.setEditor(combo, items[i], 1);
            combo.addModifyListener(new ModifyListener()
            {
                public void modifyText(ModifyEvent e)
                {
                    editor1.getItem().setText(1, combo.getText());
                }

            });

            // 保存TableItem与绑定Control的对应关系,删除TableItem时使用
            TableItemControls cons = new TableItemControls(text, combo, editor,
                    editor1);
            tablecontrols.put(items[i], cons);

        }
        // *****************************************************/
        // /***************************************************
        // 创建TableCursor对象,使用上下左右键可以控制表格
        final TableCursor cursor = new TableCursor(table, SWT.NONE);
        // 创建可编辑的控件
        final ControlEditor editor = new ControlEditor(cursor);
        editor.grabHorizontal = true;
        editor.grabVertical = true;
        // 为TableCursor对象注册事件
        cursor.addSelectionListener(new SelectionAdapter()
        {
            // 但移动光标,在单元格上单击回车所触发的事件
            public void widgetDefaultSelected(SelectionEvent e)
            {
                // 创建一个文本框控件
                final Text text = new Text(cursor, SWT.NONE);
                // 获得当前光标所在的行TableItem对象
                TableItem row = cursor.getRow();
                // 获得当前光标所在的列数
                int column = cursor.getColumn();
                // 当前光标所在单元格的值赋给文本框
                text.setText(row.getText(column));
                // 为文本框注册键盘事件
                text.addKeyListener(new KeyListener()
                {
                    @Override
                    public void keyPressed(KeyEvent e)
                    {
                        // 此时在文本框上单击回车后,这是表格中的数据为修改后文本框中的数据
                        // 然后释放文本框资源
                        if (e.character == SWT.CR)
                        {
                            TableItem row = cursor.getRow();
                            int column = cursor.getColumn();
                            row.setText(column, text.getText());
                            text.dispose();
                        }
                        // 如果在文本框中单击了ESC键,则并不对表格中的数据进行修改
                        if (e.character == SWT.ESC)
                        {
                            text.dispose();
                        }
                    }

                    @Override
                    public void keyReleased(KeyEvent e)
                    {
                        // TODO Auto-generated method stub

                    }
                });
                // 注册焦点事件
                text.addFocusListener(new FocusListener()
                {
                    // 当该文本框失去焦点时,释放文本框资源
                    public void focusLost(FocusEvent e)
                    {
                        text.dispose();
                    }

                    @Override
                    public void focusGained(FocusEvent e)
                    {
                        // TODO Auto-generated method stub

                    }
                });
                // 将该文本框绑定到可编辑的控件上
                editor.setEditor(text);
                // 设置文本框的焦点
                text.setFocus();
            }

            // 移动光标到一个单元格上所触发的事件
            public void widgetSelected(SelectionEvent e)
            {
                table.setSelection(new TableItem[]{cursor.getRow()});
            }
        });
        cursor.addMouseListener(new MouseListener()
        {

            @Override
            public void mouseDoubleClick(MouseEvent e)
            {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseDown(MouseEvent e)
            {
                if (e.button == 3)
                { // 右键按下,显示右键菜单
                    menu.setVisible(true);
                }
            }

            @Override
            public void mouseUp(MouseEvent e)
            {
                // TODO Auto-generated method stub

            }

        });
        // ******************************************************/
        // 重新布局表格
        for (int i = 0; i < tableHeader.length; i++)
        {
            table.getColumn(i).pack();
        }
        // /****************************************************
        // 为单元格注册选中事件
        table.addSelectionListener(new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent e)
            {
                // 获得所有的行数
                int total = table.getItemCount();
                // 循环所有行
                for (int i = 0; i < total; i++)
                {
                    TableItem item = table.getItem(i);
                    // 如果该行为选中状态,改变背景色和前景色,否则颜色设置
                    if (table.isSelected(i))
                    {
                        item.setBackground(sShell.getDisplay().getSystemColor(
                                SWT.COLOR_RED));
                        item.setForeground(sShell.getDisplay().getSystemColor(
                                SWT.COLOR_WHITE));
                    }
                    else
                    {
                        item.setBackground(null);
                        item.setForeground(null);
                    }
                }
            }

        });
        // ******************************************************/
    }

    public static void main(String[] args)
    {
        // 调用主窗口
        Display display = Display.getDefault();
        TableSample thisClass = new TableSample();
        thisClass.createSShell();
        thisClass.sShell.open();
        while (!thisClass.sShell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }

        display.dispose();
    }

    // 创建主窗口
    private void createSShell()
    {
        sShell = new Shell();
        sShell.setText("表格窗口");
        sShell.setLayout(new FillLayout());
        createViewForm();
        createMenu();
        sShell.setSize(new org.eclipse.swt.graphics.Point(307, 218));
        sShell.pack();
    }

    // 创建上下文菜单
    private void createMenu()
    {
        // 创建弹出式菜单
        menu = new Menu(sShell, SWT.POP_UP);
        // 设置该菜单为表格菜单
        table.setMenu(menu);
        // 创建删除菜单项
        MenuItem del = new MenuItem(menu, SWT.PUSH);
        del.setText("删除");
        del.setImage(new Image(toolBar.getDisplay(), "icons//delete.gif"));
        // 为删除菜单注册事件,当单击时,删除所选择的行
        del.addListener(SWT.Selection, new Listener()
        {
            public void handleEvent(Event event)
            {
                // 此处需添加删除绑定Control的代码
                table.remove(table.getSelectionIndices());
            }
        });
        // 创建查看菜单项
        MenuItem view = new MenuItem(menu, SWT.PUSH);
        view.setText("查看");
        view.setImage(new Image(toolBar.getDisplay(), "icons//scope.gif"));
        // 为查看菜单项注册事件,当单击时打印出所选的姓名
        view.addListener(SWT.Selection, new Listener()
        {
            public void handleEvent(Event event)
            {
                TableItem[] items = table.getSelection();
                for (int i = 0; i < items.length; i++)
                    System.out.print(items[i].getText());
            }
        });

        table.setMenu(menu);
    }

}



/*
 * 文件名:StartConfigDemo.java
 * 版权:Copyright 1986-2012 Andy. All Rights Reserved. 
 * 描述: StartConfigDemo.java
 * 修改人:Andy
 * 修改时间:2012-10-26
 * 修改内容:新增
 */
package org.wang.andy.swtjface.demo.table;

import java.util.Hashtable;
import java.util.Random;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

/**
 * 
 * <pre>
 * </pre>
 * 
 * @author Andy
 */
public class StartConfigDemo
{
    private static Hashtable<TableItem, TableItemControls> tablecontrols = new Hashtable<TableItem, TableItemControls>();

    public static void main(String[] args)
    {
        Display display = Display.getDefault();
        final Shell shell = new Shell(display);

        shell.setText("StartConfigDemo");
        shell.setBounds(150, 150, 300, 300);
        shell.setLayout(new FillLayout());

        Composite rootComposite = new Composite(shell, SWT.NONE);
        GridLayout configGridLayout = new GridLayout();
        configGridLayout.numColumns = 2;
        rootComposite.setLayout(configGridLayout);
        rootComposite.setBackground(new Color(Display.getCurrent(), 255, 255,
                255));

        ToolBar toolBar = new ToolBar(rootComposite, SWT.FLAT);
        final ToolItem addItem = new ToolItem(toolBar, SWT.PUSH);
        addItem.setImage(new Image(toolBar.getDisplay(), "icons//add.gif"));
        final ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
        deleteItem
                .setImage(new Image(toolBar.getDisplay(), "icons//delete.gif"));
        final ToolItem upItem = new ToolItem(toolBar, SWT.PUSH);
        upItem.setImage(new Image(toolBar.getDisplay(), "icons//up.gif"));
        final ToolItem downItem = new ToolItem(toolBar, SWT.PUSH);
        downItem.setImage(new Image(toolBar.getDisplay(), "icons//down.gif"));

        GridData barGridData = new GridData();
        barGridData.horizontalSpan = 2;
        barGridData.horizontalAlignment = SWT.END;
        toolBar.setLayoutData(barGridData);

        Label inputLabel = new Label(rootComposite, SWT.NONE);
        inputLabel.setText("Input:");
        inputLabel
                .setBackground(new Color(Display.getCurrent(), 255, 255, 255));
        GridData inGridData = new GridData();
        inGridData.horizontalAlignment = SWT.BEGINNING;
        inGridData.verticalAlignment = SWT.TOP;
        inputLabel.setLayoutData(inGridData);

        // ViewForm viewForm = new ViewForm(rootComposite, SWT.NONE);
        // viewForm.setTopCenterSeparate(true);
        //
        // Composite tabComposite = new Composite(viewForm, SWT.NONE);
        // GridLayout gridLayout = new GridLayout();
        // gridLayout.numColumns = 1;
        // tabComposite.setLayout(gridLayout);

        final Table table = new Table(rootComposite, SWT.MULTI
                | SWT.FULL_SELECTION | SWT.BORDER);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        String[] tableHeader = {"Name", "Type", "Default"};
        for (int i = 0; i < tableHeader.length; i++)
        {
            TableColumn tableColumn = new TableColumn(table, SWT.NONE);
            tableColumn.setText(tableHeader[i]);
        }

        TableItem item = new TableItem(table, SWT.NONE);
        item.setText(new String[]{"aaa", "vvv", "ccc"});
        item = new TableItem(table, SWT.NONE);
        item.setText(new String[]{"bbb", "111", "cc222"});
        item = new TableItem(table, SWT.NONE);
        item.setText(new String[]{"周五", "女", "567", ""});

        GridData gridData = new GridData();
        gridData.horizontalAlignment = SWT.FILL;
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.verticalAlignment = SWT.FILL;

        table.setLayoutData(gridData);

        // 重新布局表格
        for (int i = 0; i < tableHeader.length; i++)
        {
            table.getColumn(i).pack();
        }

        // 添加可编辑的单元格
        // /******************************************************
        TableItem[] items = table.getItems();
        for (int i = 0; i < items.length; i++)
        {
            // 第一列设置,创建TableEditor对象
            final TableEditor editName = new TableEditor(table);
            // 创建一个文本框,用于输入文字
            final Text name = new Text(table, SWT.NONE);
            // 将文本框当前值,设置为表格中的值
            name.setText(items[i].getText(0));
            // 设置编辑单元格水平填充
            editName.grabHorizontal = true;
            // 关键方法,将编辑单元格与文本框绑定到表格的第一列
            editName.setEditor(name, items[i], 0);
            // 当文本框改变值时,注册文本框改变事件,该事件改变表格中的数据。
            // 否则即使改变的文本框的值,对表格中的数据也不会影响
            name.addModifyListener(new ModifyListener()
            {
                public void modifyText(ModifyEvent e)
                {
                    editName.getItem().setText(1, name.getText());
                }

            });

            // 第一列设置,创建TableEditor对象
            final TableEditor editType = new TableEditor(table);
            // 创建一个文本框,用于输入文字
            final Text type = new Text(table, SWT.NONE);
            // 将文本框当前值,设置为表格中的值
            type.setText(items[i].getText(1));
            // 设置编辑单元格水平填充
            editType.grabHorizontal = true;
            // 关键方法,将编辑单元格与文本框绑定到表格的第一列
            editType.setEditor(type, items[i], 1);
            // 当文本框改变值时,注册文本框改变事件,该事件改变表格中的数据。
            // 否则即使改变的文本框的值,对表格中的数据也不会影响
            type.addModifyListener(new ModifyListener()
            {
                public void modifyText(ModifyEvent e)
                {
                    editType.getItem().setText(1, type.getText());
                }

            });

            // 第一列设置,创建TableEditor对象
            final TableEditor editValue = new TableEditor(table);
            // 创建一个文本框,用于输入文字
            final Text value = new Text(table, SWT.NONE);
            // 将文本框当前值,设置为表格中的值
            value.setText(items[i].getText(2));
            // 设置编辑单元格水平填充
            editValue.grabHorizontal = true;
            // 关键方法,将编辑单元格与文本框绑定到表格的第一列
            editValue.setEditor(value, items[i], 2);
            // 当文本框改变值时,注册文本框改变事件,该事件改变表格中的数据。
            // 否则即使改变的文本框的值,对表格中的数据也不会影响
            value.addModifyListener(new ModifyListener()
            {
                public void modifyText(ModifyEvent e)
                {
                    editValue.getItem().setText(1, value.getText());
                }

            });
            // 保存TableItem与绑定Control的对应关系,删除TableItem时使用
            TableItemControls cons = new TableItemControls(name, type, value,
                    editName, editType, editValue);
            tablecontrols.put(items[i], cons);
        }

        Label outputLabel = new Label(rootComposite, SWT.NONE);
        outputLabel.setText("Output Type:");
        outputLabel
                .setBackground(new Color(Display.getCurrent(), 255, 255, 255));
        GridData outGridData = new GridData();
        inGridData.horizontalAlignment = SWT.BEGINNING;
        outputLabel.setLayoutData(outGridData);

        Text outPut = new Text(rootComposite, SWT.BORDER);
        gridData.horizontalAlignment = SWT.FILL;
        // gridData.grabExcessHorizontalSpace = true;
        // gridData.grabExcessVerticalSpace = true;

        outPut.setLayoutData(outGridData);

        // 工具栏按钮事件处理
        Listener listener = new Listener()
        {
            @Override
            public void handleEvent(Event event)
            {
                // 如果单击添加按钮,添加一行,在实际的项目实现中通常是接收输入的参数,案后添加
                // 这里为了简单起见,添加固定的一条记录
                if (event.widget == addItem)
                {
                    TableItem item = new TableItem(table, SWT.NONE);
                    item.setText(new String[]{"郑六" + new Random().nextInt(15),
                            "女", "568"});
                }
                // 如果单击删除按钮
                else if (event.widget == deleteItem)
                {
                    // 首先获得表格中所有的行
                    TableItem[] items = table.getItems();
                    // 循环所有行
                    for (int i = items.length - 1; i >= 0; i--)
                    {
                        // 如果该行没有被选中,继续循环
                        if (!items[i].getChecked())
                            continue;
                        // 否则选中,查找该表格中是否有该行
                        int index = table.indexOf(items[i]);
                        // 如果没有该行,继续循环
                        if (index < 0)
                            continue;
                        // 删除绑定的控件
                        TableItemControls cons = tablecontrols
                                .get(items[index]);
                        if (cons != null)
                        {
                            cons.dispose();
                            tablecontrols.remove(items[index]);
                            System.out.println("dispose " + index);
                        }
                        // 如果有该行,删除该行
                        // items[index].dispose();
                        table.remove(index);
                        System.out.println("i=" + i + ", index=" + index);
                        System.out.println("行数:" + table.getItemCount());
                        // table.pack();
                    }
                }
                // 如果单击上移按钮
                else if (event.widget == upItem)
                {
                    int selectedRow = table.getSelectionIndex();
                    if (selectedRow > 0)
                        table.setSelection(selectedRow - 1);// 设置选中的行数
                }
                // 如果单击下移按钮
                else if (event.widget == upItem)
                {
                    int selectedRow = table.getSelectionIndex();
                    if (selectedRow > -1
                            && selectedRow < table.getItemCount() - 1)
                        table.setSelection(selectedRow + 1);// 设置选中的行数
                }
            }

        };
        // 为工具栏的按钮注册事件
        addItem.addListener(SWT.Selection, listener);
        deleteItem.addListener(SWT.Selection, listener);
        upItem.addListener(SWT.Selection, listener);
        downItem.addListener(SWT.Selection, listener);

        shell.open();
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
            {
                display.sleep();
            }

        }
        display.dispose();

    }
}

class TableItemControls
{
    Text name;

    Text type;

    Text value;

    TableEditor tableeditor;

    TableEditor tableeditor2;

    TableEditor tableeditor1;

    public TableItemControls(Text name, Text type, Text value,
            TableEditor tableeditor, TableEditor tableeditor1,
            TableEditor tableeditor2)
    {
        // super();
        this.name = name;
        this.type = type;
        this.value = value;
        this.tableeditor = tableeditor;
        this.tableeditor1 = tableeditor1;
        this.tableeditor2 = tableeditor2;
    }

    public void dispose()
    {
        name.dispose();
        value.dispose();
        value.dispose();
        tableeditor.dispose();
        tableeditor1.dispose();
        tableeditor2.dispose();
    }
}


  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值