首页 > 代码库 > swt_table 回车可编辑Esc取消

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 = http://www.mamicode.com/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     }

 

swt_table 回车可编辑Esc取消