swt_table 回车可编辑Esc取消
package 宿舍管理系统; 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.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
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.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; public class jtable {
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( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.ADD_OBJ));
final ToolItem del = new ToolItem(toolBar, SWT.PUSH);
del.setText("删除");
// del.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.DELETE_OBJ));
final ToolItem back = new ToolItem(toolBar, SWT.PUSH);
back.setText("上移");
// back.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.BACKWARD_NAV));
final ToolItem forward = new ToolItem(toolBar, SWT.PUSH);
forward.setText("下移");
// forward.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.FORWARD_NAV));
final ToolItem save = new ToolItem(toolBar, SWT.PUSH);
save.setText("保存");
// save.setImage( ImageFactory.loadImage( toolBar.getDisplay() , ImageFactory.SAVE_EDIT));
//工具栏按钮事件处理
Listener listener = new Listener(){
public void handleEvent(Event event) {
//如果单击添加按钮,添加一行,在实际的项目实现中通常是接收输入的参数,案后添加
//这里为了简单起见,添加固定的一条记录
if ( event.widget == add )
{
TableItem item = new TableItem(table, SWT.NONE);
item.setText(new String[] {"郑六", "女","568","zhengliu@sina.com"});
}
//如果单击删除按钮
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","zhangsan@sina.com"});
//设置图标
//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","lisi@sina.com"});
}
//设置图标
//item.setImage( ImageFactory.loadImage( table.getDisplay(),ImageFactory.ICON_BOY)); item = new TableItem(table, SWT.NONE);
item.setText(new String[] {"周五", "女","567","zhouwu@sina.com"});
//设置图标
//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);
// final Text text2 = 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 KeyAdapter() {
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();
}
}
});
//注册焦点事件
text.addFocusListener(new FocusAdapter() {
//当该文本框失去焦点时,释放文本框资源
public void focusLost(FocusEvent e) {
text.dispose();
}
});
//将该文本框绑定到可编辑的控件上
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();
jtable thisClass = new jtable();
thisClass.createSShell();
thisClass.sShell.open();
while (!thisClass.sShell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
// ImageFactory.dispose();
display.dispose();
} //创建主窗口
private void createSShell() {
sShell = new Shell();
sShell.setText("表格窗口");
sShell.setLayout(new FillLayout());
createViewForm();
createMenu();
// sShell.setImage( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.SAMPLES));
sShell.setSize(new org.eclipse.swt.graphics.Point(500,400));
// 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( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.DELETE_EDIT));
//为删除菜单注册事件,当单击时,删除所选择的行
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( ImageFactory.loadImage( sShell.getDisplay(), ImageFactory.SCOPY_EDIT));
//为查看菜单项注册事件,当单击时打印出所选的姓名
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);
} }
swt_table 回车可编辑Esc取消的更多相关文章
- GridView编辑、取消按钮自定义控件
这个需求来自于论坛一位坛友提出的问题,他希望能够自定义编辑.取消按钮,而不是用GridView自带的编辑和取消.这里只当抛砖引玉,提出一些解决方案. 首先在页面前台设置一个GridView. < ...
- gridview的编辑,更新,取消,自动分页等
gridview编辑列,把左下角的"自动生成字段"的复选框的勾去掉 添加boundfield(绑定列)将其datafield设置为productname,headertext设置为 ...
- 使用EasyUI的Datagrid的Editor进行行编辑,Enter回车结束编辑,并开启新的一行。
//新增数据function add() { if (Index == undefined) { row = { move_date: '', start_time: '', end_time: '' ...
- 如何实现GridView的选中,编辑,取消,删除功能
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { string sqlstr = &qu ...
- GridView选中,编辑,取消,删除代码
原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 2.GridView选中,编辑,取消,删除: 效果图: 后台代码:你可以使用sqlhelper,本文没用。代码如下 ...
- kendo ui 单击取消编辑数据grid减少的原因和治疗方法的数据
kendo ui单击取消编辑数据buttongrid数据缩减.原因grid编辑数据追打datasorce于data寻找阵列数据的存在.假定有不会加入,加入缺席. 首先一个样本: html代码: < ...
- 【vim】插入模式与常用编辑操作
vim不像很多编辑器那样一启动便可以直接编辑文本,需要在普通模式按下i, a等键才会进入插入模式进行文本编辑. 如何进入插入模式 以下的命令都会让vim从普通模式切换到插入模式,但命令执行后的字符插入 ...
- jqGrid行编辑配置,方法,事件
行编辑可以在行修改后更新数据,如下图所示 用户用鼠标点击选择一行,jqGrid将可编辑的字段转换为数据输入单元,如上面图所示.不可编辑的列,如id,不会转为可输入单元,而是保持不变.可以通过配置col ...
- Linux编辑利器-Vim
在大学时代,Vim 的大名就已如雷贯耳,但由于它陡峭的学习曲线,一直望而却步.等真正开始学习之后,发现并没有想象中的复杂,也没有所谓的瓶颈,只要在实际写代码中强迫自己使用就可以了,无形中就会形成习惯. ...
随机推荐
- BZOJ 1086 [SCOI2005]王室联邦 ——DFS
手把手教你树分块系列. 只需要记录一个栈,如果等于B的情况就弹栈,令省会为当前节点. 然后把待分块的序列不断上传即可. 考虑到有可能弹出不是自身节点的子树节点,所以记录一下当前的栈底. DFS即可 # ...
- BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机
本质不同的字串,考虑SA的做法,比较弱,貌似不会. 好吧,只好用SAM了,由于后缀自动机的状态最简的性质, 所有不同的字串就是∑l[i]-l[fa[i]], 然后后缀自动机是可以在线的,然后维护一下就 ...
- Spoj-BGSHOOT
The problem is about Mr.BG who is a great hunter. Today he has gone to a dense forest for hunting an ...
- bat常用命令,转【http://www.cnblogs.com/yplong/archive/2013/04/02/2996550.html】
1.@它的作用是隐藏它后面这一行的命令本身(只能影响当前行).2.echo中文为“反馈”.“回显”的意思.它其实是一个开关命令,就是说它只有两种状态:打开和关闭.于是就有了echo on和echo o ...
- centos7 下修改网络配置
修改ip地址 编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static 静态ip DEFROUTE=yes ...
- ElasticSearch 索引查询使用指南——详细版
我们通常用用_cat API检测集群是否健康. 确保9200端口号可用: curl 'localhost:9200/_cat/health?v' 绿色表示一切正常, 黄色表示所有的数据可用但是部分副本 ...
- NSArray,NSMutableArray的一些常用方法
不可变数组 ——NSArray 常用的初始化一个数组: NSArray *array1 = [[NSArray alloc] init]; NSArray *array2 = ...
- 从Activity的启动流程理解Binder
简述 关于Activity启动流程和Binder的文章很多,大多数是分开来讲的,本文将二者结合起来,着重分析启动流程中跨进程方面的细节,其实,启动流程看似调用繁多,主要是复杂在Activity栈管理等 ...
- 常用业务返回对象类ResponseJson
目录 1.ResponseJson类 2.使用举例 1.ResponseJson类 import java.io.Serializable; public class ResponseJson imp ...
- 普元OA平台介绍
Primeton Portal提供了访问企业信息资源的统一入口,是一个面向企业的内容管理.信息发布和集成展现平台,提供了单点登录.内容管理.信息发布.应用集成.个性化等功能,能够帮助企业快速搭建一个集 ...