JAVA.SWT/JFace: SWT高级控件之表格(Table、TableItem和TableColumn)

时间:2022-12-14 22:23:03

 

  
 
 
  1. package com.wjc.tree;  
  2.  
  3. import java.util.Hashtable;  
  4.  
  5. import org.eclipse.swt.SWT;  
  6. import org.eclipse.swt.custom.CCombo;  
  7. import org.eclipse.swt.custom.ControlEditor;  
  8. import org.eclipse.swt.custom.TableCursor;  
  9. import org.eclipse.swt.custom.TableEditor;  
  10. import org.eclipse.swt.custom.ViewForm;  
  11. import org.eclipse.swt.events.FocusAdapter;  
  12. import org.eclipse.swt.events.FocusEvent;  
  13. import org.eclipse.swt.events.KeyAdapter;  
  14. import org.eclipse.swt.events.KeyEvent;  
  15. import org.eclipse.swt.events.ModifyEvent;  
  16. import org.eclipse.swt.events.ModifyListener;  
  17. import org.eclipse.swt.events.MouseEvent;  
  18. import org.eclipse.swt.events.MouseListener;  
  19. import org.eclipse.swt.events.SelectionAdapter;  
  20. import org.eclipse.swt.events.SelectionEvent;  
  21. import org.eclipse.swt.layout.FillLayout;  
  22. import org.eclipse.swt.layout.GridData;  
  23. import org.eclipse.swt.layout.GridLayout;  
  24. import org.eclipse.swt.widgets.Composite;  
  25. import org.eclipse.swt.widgets.Display;  
  26. import org.eclipse.swt.widgets.Event;  
  27. import org.eclipse.swt.widgets.Listener;  
  28. import org.eclipse.swt.widgets.Menu;  
  29. import org.eclipse.swt.widgets.MenuItem;  
  30. import org.eclipse.swt.widgets.Shell;  
  31. import org.eclipse.swt.widgets.Table;  
  32. import org.eclipse.swt.widgets.TableColumn;  
  33. import org.eclipse.swt.widgets.TableItem;  
  34. import org.eclipse.swt.widgets.Text;  
  35. import org.eclipse.swt.widgets.ToolBar;  
  36. import org.eclipse.swt.widgets.ToolItem;  
  37.  
  38. public class TableSample {  
  39.     public class TableItemControls{  
  40.  
  41.      Text text;  
  42.        CCombo combo;  
  43.        TableEditor tableeditor;  
  44.        TableEditor tableeditor1;  
  45.         
  46.        public TableItemControls(Text text, CCombo combo, TableEditor tableeditor, TableEditor tableeditor1) {  
  47. //      super();  
  48.         this.text = text;  
  49.         this.combo = combo;  
  50.         this.tableeditor = tableeditor;  
  51.         this.tableeditor1 = tableeditor1;  
  52.        }  
  53.        public void dispose()  
  54.        {  
  55.         text.dispose();  
  56.         combo.dispose();  
  57.         tableeditor.dispose();  
  58.         tableeditor1.dispose();  
  59.        }  
  60.     };  
  61.     private Shell sShell = null// @jve:decl-index=0:visual-constraint="10,10"  
  62.     private ViewForm viewForm = null;  
  63.     private ToolBar toolBar = null;  
  64.     private Composite composite = null;  
  65.     private Table table = null;  
  66.     private Menu menu = null;  
  67.     private Hashtable<TableItem, TableItemControls> tablecontrols = new Hashtable<TableItem, TableItemControls>();  
  68.  
  69.     //创建ViewForm面板放置工具栏和表格  
  70.     private void createViewForm() {  
  71.        viewForm = new ViewForm(sShell, SWT.NONE);  
  72.        viewForm.setTopCenterSeparate(true);  
  73.        createToolBar();  
  74.        viewForm.setTopLeft(toolBar);  
  75.        createComposite();  
  76.        viewForm.setContent(composite);  
  77.     }  
  78.  
  79.     //创建工具栏  
  80.     private void createToolBar() {  
  81.        toolBar = new ToolBar(viewForm, SWT.FLAT);  
  82.        final ToolItem add = new ToolItem(toolBar, SWT.PUSH);  
  83.        add.setText("添加");  
  84. //     add.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.ADD_OBJ));  
  85.        final ToolItem del = new ToolItem(toolBar, SWT.PUSH);  
  86.        del.setText("删除");  
  87. //     del.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.DELETE_OBJ));  
  88.        final ToolItem back = new ToolItem(toolBar, SWT.PUSH);  
  89.        back.setText("上移");  
  90. //     back.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.BACKWARD_NAV));  
  91.        final ToolItem forward = new ToolItem(toolBar, SWT.PUSH);  
  92.        forward.setText("下移");  
  93. //     forward.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.FORWARD_NAV));  
  94.        final ToolItem save = new ToolItem(toolBar, SWT.PUSH);  
  95.        save.setText("保存");  
  96. //     save.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.SAVE_EDIT));  
  97.        //工具栏按钮事件处理  
  98.        Listener listener = new Listener(){  
  99.         public void handleEvent(Event event) {  
  100.          //如果单击添加按钮,添加一行,在实际的项目实现中通常是接收输入的参数,案后添加  
  101.          //这里为了简单起见,添加固定的一条记录  
  102.          if ( event.widget == add )  
  103.          {  
  104.           TableItem item = new TableItem(table, SWT.NONE);  
  105.           item.setText(new String[] {"郑六""女","568","zhengliu@sina.com"});  
  106.          }  
  107.          //如果单击删除按钮  
  108.          else if ( event.widget == del)  
  109.          {  
  110.           //首先获得表格中所有的行  
  111.           TableItem[] items = table.getItems();  
  112.           //循环所有行  
  113.           for ( int i=items.length-1;i>=0;i-- ){  
  114.            //如果该行没有被选中,继续循环  
  115.            if ( !items[i].getChecked())  
  116.             continue;  
  117.            //否则选中,查找该表格中是否有该行  
  118.            int index = table.indexOf( items[i]);  
  119.            //如果没有该行,继续循环  
  120.            if (index<0)  
  121.             continue;  
  122.            //删除绑定的控件  
  123.            TableItemControls cons = tablecontrols.get(items[index]);  
  124.            if (cons != null) {  
  125.             cons.dispose();  
  126.             tablecontrols.remove(items[index]);  
  127.             System.out.println("dispose " + index);  
  128.            }  
  129.            //如果有该行,删除该行  
  130. //         items[index].dispose();  
  131.            table.remove( index );  
  132.            System.out.println("i="+i+", index="+index);  
  133.            System.out.println("行数:" + table.getItemCount());  
  134. //         table.pack();  
  135.           }  
  136.          }  
  137.          //如果单击上移按钮  
  138.          else if ( event.widget == back)  
  139.          {  
  140.           int selectedRow = table.getSelectionIndex();  
  141.           if ( selectedRow > 0 )  
  142.            table.setSelection( selectedRow-1 );//设置选中的行数  
  143.          }  
  144.          //如果单击下移按钮  
  145.          else if ( event.widget == forward)  
  146.          {  
  147.           int selectedRow = table.getSelectionIndex();  
  148.           if ( selectedRow > -1&& selectedRow<table.getItemCount()-1)  
  149.            table.setSelection( selectedRow+1 );//设置选中的行数  
  150.          }  
  151.          //如果单击保存按钮  
  152.          else if ( event.widget == save)  
  153.          {  
  154.           TableItem [] items = table.getItems();  
  155.           //保存到文件或数据库中,数据持久化,这里省略  
  156.           for ( int i=0;i<items.length;i++)  
  157.            for (int j=0;j<table.getColumnCount();j++)  
  158.             System.out.println(items[i].getText(j));  
  159.          }  
  160.         }  
  161.          
  162.        };  
  163.        //为工具栏的按钮注册事件  
  164.        add.addListener( SWT.Selection , listener );  
  165.        del.addListener( SWT.Selection, listener );  
  166.        back.addListener( SWT.Selection , listener );  
  167.        forward.addListener( SWT.Selection, listener );  
  168.        save.addListener( SWT.Selection, listener );  
  169.     }  
  170.     //创建放置表格的面板  
  171.     private void createComposite() {  
  172.        GridLayout gridLayout = new GridLayout();  
  173.        gridLayout.numColumns = 1;  
  174.        composite = new Composite(viewForm, SWT.NONE);  
  175.        composite.setLayout(gridLayout);  
  176.        createTable();  
  177.     }  
  178.     //创建表格  
  179.     private void createTable() {  
  180.        //表格布局  
  181.        GridData gridData = new org.eclipse.swt.layout.GridData();  
  182.        gridData.horizontalAlignment = SWT.FILL;  
  183.        gridData.grabExcessHorizontalSpace = true;  
  184.        gridData.grabExcessVerticalSpace = true;  
  185.        gridData.verticalAlignment = SWT.FILL;  
  186.         
  187.        //创建表格,使用SWT.FULL_SELECTION样式,可同时选中一行  
  188.        table = new Table(composite, SWT.MULTI|SWT.FULL_SELECTION|SWT.CHECK);  
  189.        table.setHeaderVisible(true);//设置显示表头  
  190.        table.setLayoutData(gridData);//设置表格布局  
  191.        table.setLinesVisible(true);//设置显示表格线/*  
  192.        //创建表头的字符串数组  
  193.        String[] tableHeader = {"姓名","性别","电话","电子邮件"};  
  194.        for (int i=0;i<tableHeader.length;i++){  
  195.         TableColumn tableColumn = new TableColumn(table, SWT.NONE);  
  196.         tableColumn.setText( tableHeader[i]);  
  197.         //设置表头可移动,默认为false  
  198.         tableColumn.setMoveable(true);  
  199.        }  
  200.        //添加三行数据  
  201.        TableItem item = new TableItem(table, SWT.NONE);  
  202.        item.setText(new String[] {"张三""男","123","zhangsan@sina.com"});  
  203.        //设置图标  
  204.        //item.setImage( ImageFactory.loadImage( table.getDisplay(),ImageFactory.ICON_BOY));  
  205.         
  206.        for (int i = 0; i < 5; i++) {  
  207.         item = new TableItem(table, SWT.NONE);  
  208.         item.setText(new String[] {"李四""男","4582","lisi@sina.com"});  
  209.        }  
  210.        //设置图标  
  211.        //item.setImage( ImageFactory.loadImage( table.getDisplay(),ImageFactory.ICON_BOY));  
  212.         
  213.        item = new TableItem(table, SWT.NONE);  
  214.        item.setText(new String[] {"周五""女","567","zhouwu@sina.com"});  
  215.        //设置图标  
  216.        //item.setImage( ImageFactory.loadImage( table.getDisplay(),ImageFactory.ICON_GIRL));  
  217.  
  218.        //添加可编辑的单元格  
  219.        // /******************************************************  
  220.        TableItem [] items = table.getItems ();  
  221.        for (int i=0; i<items.length; i++) {  
  222.         //第一列设置,创建TableEditor对象  
  223.         final TableEditor editor = new TableEditor (table);  
  224.         //创建一个文本框,用于输入文字  
  225.         final Text text = new Text (table, SWT.NONE);  
  226.         //将文本框当前值,设置为表格中的值  
  227.         text.setText(items[i].getText(0));  
  228.         //设置编辑单元格水平填充  
  229.         editor.grabHorizontal = true;  
  230.         //关键方法,将编辑单元格与文本框绑定到表格的第一列  
  231.         editor.setEditor(text, items[i], 0);  
  232.         //当文本框改变值时,注册文本框改变事件,该事件改变表格中的数据。  
  233.         //否则即使改变的文本框的值,对表格中的数据也不会影响  
  234.         text.addModifyListener( new ModifyListener(){  
  235.          public void modifyText(ModifyEvent e) {  
  236.           editor.getItem().setText(1,text.getText());  
  237.          }  
  238.           
  239.         });  
  240.         //同理,为第二列绑定下来框CCombo  
  241.         final TableEditor editor1 = new TableEditor (table);  
  242.         final CCombo combo = new CCombo (table, SWT.NONE);  
  243.         combo.add("男");  
  244.         combo.add("女");  
  245.         combo.setText(items[i].getText(1));  
  246.         editor1.grabHorizontal = true;  
  247.         editor1.setEditor(combo, items[i], 1);  
  248.         combo.addModifyListener( new ModifyListener(){  
  249.          public void modifyText(ModifyEvent e) {  
  250.           editor1.getItem().setText(1,combo.getText());  
  251.          }  
  252.           
  253.         });  
  254.          
  255.         // 保存TableItem与绑定Control的对应关系,删除TableItem时使用  
  256.         TableItemControls cons = new TableItemControls(text, combo, editor, editor1);  
  257.         tablecontrols.put(items[i], cons);  
  258.          
  259.        }    
  260.        // *****************************************************/  
  261.             // /***************************************************  
  262.        //创建TableCursor对象,使用上下左右键可以控制表格  
  263.        final TableCursor cursor = new TableCursor(table, SWT.NONE);  
  264.        //创建可编辑的控件  
  265.        final ControlEditor editor = new ControlEditor(cursor);  
  266.        editor.grabHorizontal = true;  
  267.        editor.grabVertical = true;  
  268.        //为TableCursor对象注册事件  
  269.        cursor.addSelectionListener( new SelectionAdapter() {  
  270.         //但移动光标,在单元格上单击回车所触发的事件  
  271.         public void widgetDefaultSelected(SelectionEvent e) {  
  272.          //创建一个文本框控件  
  273.          final Text text = new Text(cursor, SWT.NONE);  
  274.          //获得当前光标所在的行TableItem对象  
  275.          TableItem row = cursor.getRow();  
  276.          //获得当前光标所在的列数  
  277.          int column = cursor.getColumn();  
  278.          //当前光标所在单元格的值赋给文本框  
  279.          text.setText(row.getText(column));  
  280.          //为文本框注册键盘事件  
  281.          text.addKeyListener(new KeyAdapter() {  
  282.           public void keyPressed(KeyEvent e) {  
  283.            //此时在文本框上单击回车后,这是表格中的数据为修改后文本框中的数据  
  284.            //然后释放文本框资源  
  285.            if (e.character == SWT.CR) {  
  286.             TableItem row = cursor.getRow();  
  287.             int column = cursor.getColumn();  
  288.             row.setText(column, text.getText());  
  289.             text.dispose();  
  290.            }  
  291.            //如果在文本框中单击了ESC键,则并不对表格中的数据进行修改  
  292.            if (e.character == SWT.ESC) {  
  293.             text.dispose();  
  294.            }  
  295.           }  
  296.          });  
  297.          //注册焦点事件  
  298.          text.addFocusListener(new FocusAdapter() {  
  299.           //当该文本框失去焦点时,释放文本框资源  
  300.           public void focusLost(FocusEvent e) {  
  301.            text.dispose();  
  302.           }  
  303.          });  
  304.          //将该文本框绑定到可编辑的控件上  
  305.          editor.setEditor(text);  
  306.          //设置文本框的焦点  
  307.          text.setFocus();  
  308.         }  
  309.         //移动光标到一个单元格上所触发的事件  
  310.         public void widgetSelected(SelectionEvent e) {  
  311.          table.setSelection(new TableItem[] { cursor.getRow()});  
  312.         }  
  313.        });  
  314.        cursor.addMouseListener(new MouseListener() {  
  315.  
  316.         @Override 
  317.         public void mouseDoubleClick(MouseEvent e) {  
  318.          // TODO Auto-generated method stub  
  319.           
  320.         }  
  321.  
  322.         @Override 
  323.         public void mouseDown(MouseEvent e) {  
  324.          if (e.button==3) { // 右键按下,显示右键菜单  
  325.           menu.setVisible(true);  
  326.          }  
  327.         }  
  328.  
  329.         @Override 
  330.         public void mouseUp(MouseEvent e) {  
  331.          // TODO Auto-generated method stub  
  332.           
  333.         }  
  334.          
  335.        });  
  336.        // ******************************************************/  
  337.        //重新布局表格  
  338.        for (int i=0; i<tableHeader.length; i++) {  
  339.         table.getColumn (i).pack ();  
  340.        }  
  341.        // /****************************************************  
  342.        //为单元格注册选中事件  
  343.        table.addSelectionListener( new SelectionAdapter(){  
  344.         public void widgetSelected(SelectionEvent e) {  
  345.          //获得所有的行数  
  346.          int total = table.getItemCount();  
  347.          //循环所有行  
  348.          for ( int i=0;i<total;i++){  
  349.           TableItem item = table.getItem(i);  
  350.           //如果该行为选中状态,改变背景色和前景色,否则颜色设置  
  351.           if (table.isSelected( i )){   
  352.            item.setBackground( sShell.getDisplay().getSystemColor( SWT.COLOR_RED));  
  353.            item.setForeground( sShell.getDisplay().getSystemColor( SWT.COLOR_WHITE));  
  354.           }else {  
  355.            item.setBackground( null );  
  356.            item.setForeground( null );  
  357.           }  
  358.          }  
  359.         }  
  360.          
  361.        });  
  362.        // ******************************************************/  
  363.     }  
  364.  
  365.     public static void main(String[] args) {  
  366.        //调用主窗口  
  367.        Display display = Display.getDefault();  
  368.        TableSample thisClass = new TableSample();  
  369.        thisClass.createSShell();  
  370.        thisClass.sShell.open();  
  371.        while (!thisClass.sShell.isDisposed()) {  
  372.         if (!display.readAndDispatch())  
  373.          display.sleep();  
  374.        }  
  375. //     ImageFactory.dispose();  
  376.        display.dispose();  
  377.     }  
  378.  
  379.     //创建主窗口  
  380.     private void createSShell() {  
  381.        sShell = new Shell();  
  382.        sShell.setText("表格窗口");  
  383.        sShell.setLayout(new FillLayout());  
  384.        createViewForm();  
  385.        createMenu();  
  386. //     sShell.setImage( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.SAMPLES));  
  387.        sShell.setSize(new org.eclipse.swt.graphics.Point(307,218));  
  388.        sShell.pack();  
  389.     }  
  390.     //创建上下文菜单  
  391.     private void createMenu() {  
  392.        //创建弹出式菜单  
  393.        menu = new Menu (sShell, SWT.POP_UP);  
  394.        //设置该菜单为表格菜单  
  395.        table.setMenu (menu);  
  396.        //创建删除菜单项  
  397.        MenuItem del = new MenuItem (menu, SWT.PUSH);  
  398.        del.setText ("删除");  
  399. //     del.setImage( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.DELETE_EDIT));  
  400.        //为删除菜单注册事件,当单击时,删除所选择的行  
  401.        del.addListener (SWT.Selection, new Listener () {  
  402.         public void handleEvent (Event event) {  
  403.          // 此处需添加删除绑定Control的代码  
  404.          table.remove (table.getSelectionIndices ());  
  405.         }  
  406.        });  
  407.        //创建查看菜单项  
  408.        MenuItem view = new MenuItem (menu, SWT.PUSH);  
  409.        view.setText ("查看");  
  410. //     view.setImage( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.SCOPY_EDIT));  
  411.        //为查看菜单项注册事件,当单击时打印出所选的姓名  
  412.        view.addListener (SWT.Selection, new Listener () {  
  413.         public void handleEvent (Event event) {  
  414.          TableItem[] items = table.getSelection();  
  415.          for (int i=0;i<items.length;i++)  
  416.           System.out.print(items[i].getText());  
  417.         }  
  418.        });  
  419.         
  420.        table.setMenu(menu);  
  421.     }  
  422.  
  423.     }  
  424.  
  425.