• swt_table 回车可编辑Esc取消


      1 package 宿舍管理系统;  
      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 jtable {  
     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        
    221        
    222        
    223        
    224        
    225        
    226        
    227        
    228        //添加可编辑的单元格  
    229        // /******************************************************  
    230        TableItem [] items = table.getItems ();  
    231        for (int i=0; i<items.length; i++) { 
    232            
    233            
    234            
    235            
    236            
    237            
    238         //第一列设置,创建TableEditor对象  
    239 //        final TableEditor editor = new TableEditor (table);  
    240 //        //创建一个文本框,用于输入文字  
    241 //        final Text text = new Text (table, SWT.NONE);
    242 //        final Text text2 = new Text (table, SWT.NONE);
    243 //        //将文本框当前值,设置为表格中的值  
    244 //        text.setText(items[i].getText(0));
    245 //
    246 //        //设置编辑单元格水平填充  
    247 //        editor.grabHorizontal = true;  
    248 //        //关键方法,将编辑单元格与文本框绑定到表格的第一列  
    249 //        editor.setEditor(text, items[i], 0); 
    250 //        //当文本框改变值时,注册文本框改变事件,该事件改变表格中的数据。  
    251 //        //否则即使改变的文本框的值,对表格中的数据也不会影响  
    252 //        text.addModifyListener( new ModifyListener(){  
    253 //         public void modifyText(ModifyEvent e) {  
    254 //          editor.getItem().setText(1,text.getText());  
    255 //         } }); 
    256 //        //同理,为第二列绑定下来框CCombo  
    257 //        final TableEditor editor1 = new TableEditor (table);  
    258 //        final CCombo combo = new CCombo (table, SWT.NONE);  
    259 //        combo.add("男");  
    260 //        combo.add("女");  
    261 //        combo.setText(items[i].getText(1));  
    262 //        editor1.grabHorizontal = true;  
    263 //        editor1.setEditor(combo, items[i], 1);  
    264 //        combo.addModifyListener( new ModifyListener(){  
    265 //         public void modifyText(ModifyEvent e) {  
    266 //          editor1.getItem().setText(1,combo.getText());  
    267 //         }    
    268 //        });  
    269 //        // 保存TableItem与绑定Control的对应关系,删除TableItem时使用  
    270 //        TableItemControls cons = new TableItemControls(text, combo, editor, editor1);  
    271 //        tablecontrols.put(items[i], cons);  
    272          
    273        } 
    274        // *****************************************************/  
    275             // /***************************************************  
    276        //创建TableCursor对象,使用上下左右键可以控制表格  
    277        final TableCursor cursor = new TableCursor(table, SWT.NONE);  
    278        //创建可编辑的控件  
    279        final ControlEditor editor = new ControlEditor(cursor);  
    280        editor.grabHorizontal = true;  
    281        editor.grabVertical = true;  
    282        //为TableCursor对象注册事件  
    283        cursor.addSelectionListener( new SelectionAdapter() {  
    284         //但移动光标,在单元格上单击回车所触发的事件  
    285          public void widgetDefaultSelected(SelectionEvent e) {  
    286          //创建一个文本框控件  
    287          final Text text = new Text(cursor, SWT.NONE);  
    288          //获得当前光标所在的行TableItem对象  
    289          TableItem row = cursor.getRow();
    290          //获得当前光标所在的列数
    291          int column = cursor.getColumn();  
    292          //当前光标所在单元格的值赋给文本框  
    293          text.setText(row.getText(column));  
    294          //为文本框注册键盘事件  
    295          text.addKeyListener(new KeyAdapter() {  
    296           public void keyPressed(KeyEvent e) {  
    297            //此时在文本框上单击回车后,这是表格中的数据为修改后文本框中的数据  
    298            //然后释放文本框资源  
    299            if (e.character == SWT.CR) {  
    300             TableItem row = cursor.getRow();  
    301             int column = cursor.getColumn();  
    302             row.setText(column, text.getText());  
    303             text.dispose();  
    304            }  
    305            //如果在文本框中单击了ESC键,则并不对表格中的数据进行修改  
    306            if (e.character == SWT.ESC) {  
    307             text.dispose();  
    308            }  
    309           }  
    310          });  
    311          //注册焦点事件  
    312          text.addFocusListener(new FocusAdapter() {  
    313           //当该文本框失去焦点时,释放文本框资源  
    314           public void focusLost(FocusEvent e) {  
    315            text.dispose();  
    316           }  
    317          });  
    318          //将该文本框绑定到可编辑的控件上  
    319          editor.setEditor(text);  
    320          //设置文本框的焦点  
    321          text.setFocus();  
    322         }  
    323         //移动光标到一个单元格上所触发的事件  
    324         public void widgetSelected(SelectionEvent e) {  
    325          table.setSelection(new TableItem[] { cursor.getRow()});  
    326         }  
    327        });  
    328        cursor.addMouseListener(new MouseListener() {  
    329  
    330         @Override 
    331         public void mouseDoubleClick(MouseEvent e) {  
    332          // TODO Auto-generated method stub  
    333           
    334         }  
    335  
    336         @Override 
    337         public void mouseDown(MouseEvent e) {  
    338          if (e.button==3) { // 右键按下,显示右键菜单  
    339           menu.setVisible(true);  
    340          }  
    341         }  
    342  
    343         @Override 
    344         public void mouseUp(MouseEvent e) {  
    345          // TODO Auto-generated method stub  
    346           
    347         }  
    348          
    349        });  
    350        // ******************************************************/  
    351        //重新布局表格  
    352        for (int i=0; i<tableHeader.length; i++) {  
    353         table.getColumn (i).pack ();  
    354        }  
    355        // /****************************************************  
    356        //为单元格注册选中事件  
    357        table.addSelectionListener( new SelectionAdapter(){  
    358         public void widgetSelected(SelectionEvent e) {  
    359          //获得所有的行数  
    360          int total = table.getItemCount();  
    361          //循环所有行  
    362          for ( int i=0;i<total;i++){  
    363           TableItem item = table.getItem(i);  
    364           //如果该行为选中状态,改变背景色和前景色,否则颜色设置  
    365           if (table.isSelected( i )){   
    366            item.setBackground( sShell.getDisplay().getSystemColor( SWT.COLOR_RED));  
    367            item.setForeground( sShell.getDisplay().getSystemColor( SWT.COLOR_WHITE));  
    368           }else {  
    369            item.setBackground( null );  
    370            item.setForeground( null );  
    371           }  
    372          }  
    373         }  
    374          
    375        });  
    376        // ******************************************************/  
    377     }   
    378     public static void main(String[] args) {  
    379        //调用主窗口  
    380        Display display = Display.getDefault();  
    381        jtable thisClass = new jtable();  
    382        thisClass.createSShell();  
    383        thisClass.sShell.open();  
    384        while (!thisClass.sShell.isDisposed()) {  
    385         if (!display.readAndDispatch())  
    386          display.sleep();  
    387        }  
    388 //     ImageFactory.dispose();  
    389        display.dispose();  
    390     }  
    391  
    392     //创建主窗口  
    393     private void createSShell() {  
    394        sShell = new Shell();  
    395        sShell.setText("表格窗口");  
    396        sShell.setLayout(new FillLayout());  
    397        createViewForm();  
    398        createMenu();  
    399 //     sShell.setImage( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.SAMPLES));  
    400        sShell.setSize(new org.eclipse.swt.graphics.Point(500,400));  
    401   //     sShell.pack();  
    402     }  
    403     //创建上下文菜单  
    404     private void createMenu() {  
    405        //创建弹出式菜单  
    406        menu = new Menu (sShell, SWT.POP_UP);  
    407        //设置该菜单为表格菜单  
    408        table.setMenu (menu);  
    409        //创建删除菜单项  
    410        MenuItem del = new MenuItem (menu, SWT.PUSH);  
    411        del.setText ("删除");  
    412 //     del.setImage( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.DELETE_EDIT));  
    413        //为删除菜单注册事件,当单击时,删除所选择的行  
    414        del.addListener (SWT.Selection, new Listener () {  
    415         public void handleEvent (Event event) {  
    416          // 此处需添加删除绑定Control的代码  
    417          table.remove (table.getSelectionIndices ());  
    418         }  
    419        });  
    420        //创建查看菜单项  
    421        MenuItem view = new MenuItem (menu, SWT.PUSH);  
    422        view.setText ("查看");  
    423 //     view.setImage( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.SCOPY_EDIT));  
    424        //为查看菜单项注册事件,当单击时打印出所选的姓名  
    425        view.addListener (SWT.Selection, new Listener () {  
    426         public void handleEvent (Event event) {  
    427          TableItem[] items = table.getSelection();  
    428          for (int i=0;i<items.length;i++)  
    429           System.out.print(items[i].getText());  
    430         }  
    431        });  
    432         
    433        table.setMenu(menu);  
    434     }  
    435  
    436     }
  • 相关阅读:
    restful架构风格设计准则(四)资源表示和资源访问
    洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)
    HDU 6138 Fleet of the Eternal Throne(后缀自动机)
    BZOJ1278: 向量vector(计算几何 随机化乱搞)
    BZOJ2564: 集合的面积(闵可夫斯基和 凸包)
    POJ 1113 Wall(思维 计算几何 数学)
    POJ 3304 Segments(直线与线段相交)
    洛谷P1742 最小圆覆盖(计算几何)
    洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
    洛谷P3193 [HNOI2008]GT考试(dp 矩阵乘法)
  • 原文地址:https://www.cnblogs.com/the-wang/p/6979218.html
Copyright © 2020-2023  润新知