扩展table类,在很多时候table都不止局限于文本的显示,可能还有可输入文本框,按钮,等控件。
在这点利用tableeditor可以解决,但是也是由于tableeditor比较冗余的代码,所以我把它封装在一个控件里面,同时也解决了获取item内容的问题
YtTableItem.java
在自定义的item中,会自动添加tableEditor,
/**
* 添加受控控件,只接受实现IYtTableSubComp的control
* */
public void addChild(IYtTableSubComp control) {
childContentMap.put(index, control);
final TableEditor editor = new TableEditor(item.getParent());
editor.setEditor((Control)control, item, index);
editor.grabHorizontal = true;
index++;
}
/**
* 生成包装好的text
* */
public static IYtTableSubComp getTextSub(Composite parent , int style , String txt){
YtTableSubComp su = new YtTableSubComp(parent);
Text text = new Text(su, style);
text.setText(txt);
return su;
}
/**
* 生成包装好的btn
* */
public static IYtTableSubComp getBtnSub(Composite parent , int style , String text){
YtTableSubComp su = new YtTableSubComp(parent);
Button btn = new Button(su, style);
btn.setText(text);
return su;
}
/**
* 获取item的所有内容,每个用|隔开
* */
public String getText() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < index; i++) {
if (childContentMap.get(i) == null) {//如果是单一文字
sb.append(item.getText(i) + "|");
} else {//如果是控件
IYtTableSubComp su = childContentMap.get(i);
sb.append(su.getText() + "|");
}
}
return sb.toString();
}
YtTableSubComp.java中的实现
因为YtTableSubComp包装了多种子控件,所以用getText可以统一处理,不用再一个个的获取条目中特殊控件的值
/**
* 获取文本数据
* */
public String getText(){
Control con = getRealInst();
if(con instanceof Button){
Button btn = (Button)con;
return btn.getSelection() + "";
}else if(con instanceof Text){
Text text = (Text)con;
return text.getText() + "";
}else if(con instanceof IYtTableSubComp){
IYtTableSubComp su = (IYtTableSubComp)con;
return su.getText();
}
return "";
}
YtTableComp.java
包装了table的类,里面设置了换行换行要加\n,自动增高。
table.addListener(SWT.MeasureItem, paintListener);
/**以下两个方法可以同时删除,但会印象到点击之后焦点的矩形*/
table.addListener(SWT.PaintItem, paintListener);
table.addListener(SWT.EraseItem, paintListener);
获取被选择的item的文本
/**
* 获取被选择的文本,每个item用SPLIST_SYM隔开
* */
public String getSelectText(){
selectText = new StringBuilder("");
int[] t = getTable().getSelectionIndices();
for(int i : t){
selectText.append(itemList.get(i).getText()+SPLIST_SYM);
}
System.err.println(selectText);
return selectText.toString();
}
test.java
final YtTableComp tc = new YtTableComp(shell);
//设置表头文字
tc.initColumn(new String[] { "测试啦", "出生时", "第三个", "第4个" });
//设置宽度
tc.setWidths(new int[] { 100, 150, 50, 100 });
for (int i = 0; i < 3; i++) {
/** 组装成一个item */
final YtTableItem myItem = new YtTableItem(tc, 0);
YtTableSubComp btn = (YtTableSubComp) YtTableItem.getBtnPushSub(tc.getTable());
btn.setSize(30,20);
btn.addListener(SWT.MouseUp, new Listener() {
@Override
public void handleEvent(Event event) {
// TODO Auto-generated method stub
System.err.println("我被点击了,执行事件");
}
});
/** 将需要显示的特殊控件放入yttableItem去 */
myItem.addChild(btn);
myItem.addChild("啦啦啦啦" );
//myItem.addChild("啦啦啦啦\n"+i);//加\n就可以换行了
myItem.addChild(YtTableItem.getTextSub(tc.getTable()));
myItem.addChild(YtTableItem.getBtnSub(tc.getTable(), SWT.RADIO, "单选按钮"));
}
Button btn = new Button(shell, SWT.PUSH);
btn.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
//只要调用tc.getSelectText()就可以拿到选中的item的文本
System.err.println(tc.getSelectText());;
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
});
btn.setText("点我输出东西");