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","[email protected]"});
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","[email protected]"});
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","[email protected]"});
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","[email protected]"});
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     }
时间: 2024-11-11 15:51:19

swt_table 回车可编辑Esc取消的相关文章

GridView编辑、取消按钮自定义控件

这个需求来自于论坛一位坛友提出的问题,他希望能够自定义编辑.取消按钮,而不是用GridView自带的编辑和取消.这里只当抛砖引玉,提出一些解决方案. 首先在页面前台设置一个GridView. <div> <asp:GridView ID="GridView1" runat="server"> <Columns> <asp:TemplateField HeaderText="操作"> <Item

GridVIew控件选中、编辑、取消、删除数据项

<asp:GridView ID="GridView1" runat="server" OnRowDeleting="GridView1_RowDeleting" OnRowEditing="GridView1_RowEditing"                        OnRowUpdating="GridView1_RowUpdating" OnRowCancelingEdit=&quo

CridView创建 实现选中,编辑,取消,删除

前台: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 前台主要代码: ... ... <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" Fo

GridView选中,编辑,取消,删除代码

原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 2.GridView选中,编辑,取消,删除: 效果图: 后台代码:你可以使用sqlhelper,本文没用。代码如下:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebContr

ps快捷键总结

1.颜色填充 Alt+del 前景色 Ctrl+del 背景色 前景色和背景色快速重置和切换 重置D 切换 x 2.屏幕操作方式 缩放:按住Alt滚动鼠标滚轮 平移:按住空格按住鼠标左键移动 3.启动任务管理 ctrl+Alt+Delete 4.首选项 ctrl+k 5.图像大小 ctrl+Alt+i 6.画布大小 ctrl+Alt+c 7.显示/关闭参考线 ctrl+: 8.显示/关闭网格 ctrl+' 9.置顶 ctrl+shift+] 10.置底 ctrl+shift+[ 11.建组 ct

kendo ui 编辑数据点击取消grid数据减少原因及处理方案

kendo ui编辑数据点击取消按钮grid数据减少的,造成的原因是grid编辑完一条数据会去datasorce中data数组中查找是否存在该数据,如果存在就不添加,不存在就添加. 先做一个例子: html代码: <div id="smsReceivesGird" style="width: 500px;"></div> js代码: <pre name="code" class="html">

5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践

5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 扩展 vim的特殊用法 http://www.apelearn.com/bbs/thread-9334-1-1.html vim常用快捷键总结 http://www.apelearn.com/bbs/thread-407-1-1.html vim快速删除一段字符 http://www.apelearn.com/bbs/thread-842-1-1.html vim乱码 http://www.apelearn.com/bbs/thr

【vim】插入模式与常用编辑操作

vim不像很多编辑器那样一启动便可以直接编辑文本,需要在普通模式按下i, a等键才会进入插入模式进行文本编辑. 如何进入插入模式 以下的命令都会让vim从普通模式切换到插入模式,但命令执行后的字符插入位置有所不同. 命令 执行后的字符插入位置 i  当前字符之前 I  当前行首第一个非空白字符之前  a  当前字符之后 A  当前行尾 s  删除当前字符,光标停留在下一个字符处 S  删除当前行,光标停留在行首 o  在当前行的下方插入一个新行,光标停在新行行首 O  在当前行的上方插入一个新行

JQuery实战--可以编辑的表格

今天学习到了一个实例,其名称为的可以编辑的表格.其实现的效果是:点击页面上的单元格,单元格中的内容变成选中状态,变成可以输入的状态,向单元格中输入内容,按下回车,单元格保存其修改后的结果,按ESC,单元格的内容还原成原来的内容.其原理是:点击单元格的时候,在单元格内添加一个文本框,其大小充满整个单元格,其内容为单元格中的内容,修改后的内容重新赋给单元格. HTML代码: <span style="font-size:18px;"><!DOCTYPE html>