在swt中,tableeditor提供了添加tableItem添加附加控件的功能。但是在删除的时候,
有可能会遇到删除了item,btn,editor之后,item和btn没有对齐的情况,就好像下面这种。
那问题怎么解决呢,其实很简单,你可以重新去调用一次tableEditor的layout()事件,就可以帮你刷新了。
又或者重新再setEditor,当然有最方便的,调用table.notifyListeners(SWT.KeyDown, null);
下面是一个小栗子
import java.util.HashMap; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; public class TView extends Composite { private Table table; public static final String[] COLUMU_NAME = { "ID", "状态" }; public static final int[] COLUMU_WIDTH = { 50, 70 }; private TView me; private HashMap<Integer, TableEditor> editorHm = new HashMap<Integer, TableEditor>();// 存放tableEditor private HashMap<Integer, Button> btnHm = new HashMap<Integer, Button>();// 存放按钮 private HashMap<Integer, TableItem> itemHm = new HashMap<Integer, TableItem>();// 存放tableitem public TView(Composite parent, int style) { super(parent, style); me = this; initTable(); } private void initTable() { me.setLayout(new FillLayout()); table = new Table(this, SWT.FULL_SELECTION | SWT.MULTI); for (int i = 0; i < COLUMU_NAME.length; i++) { TableColumn t = new TableColumn(table, SWT.LEFT); t.setText(COLUMU_NAME[i]); t.setWidth(COLUMU_WIDTH[i]); } table.setHeaderVisible(true); table.setLinesVisible(true); initTableContent(); } private void initTableContent() { for (int i = 0; i < 10; i++) { TableItem item = new TableItem(table, 0); item.setText(0, i + ""); item.setData(i);// 做匹配的标志,可以用其它方法,只要达到删除时删除btn的功能就可以了 Button btn = new Button(table, 0); btn.setText("来点我啊" + i); btn.setData(i); TableEditor editor = new TableEditor(table); editor.grabHorizontal = true; editor.minimumWidth = 10; editor.minimumHeight = 20; editor.setEditor(btn, item, COLUMU_NAME.length - 1); editorHm.put(i, editor); itemHm.put(i, item); btnHm.put(i, btn); btn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent arg0) { int bIndex = Integer.valueOf(arg0.widget.getData() + ""); TableItem[] items = table.getItems(); for (int i = 0; i < items.length; i++) { TableItem item = items[i]; int index = Integer.valueOf(item.getData() + ""); if (index == bIndex) { System.err.println("找到了"); // 释放掉 editorHm.get(index).dispose();// 当editor.dispose的时候,并不会讲里面的控件也一并dispose,而是将引用设置为null table.remove(i); btnHm.get(index).dispose(); // 删除掉 editorHm.remove(index); btnHm.remove(index); itemHm.remove(index); break; } } // 一下三种都可以达到刷新的效果 table.notifyListeners(SWT.KeyDown, null); // flushEditor(); // setEditor } }); } } /** * * 重新设定TableEditor令其强制更新,此段代码可以注释掉,可以看到效果 * * */ private void flushEditor() { for (int key : editorHm.keySet()) { TableEditor editor = editorHm.get(key); editor.layout();// .setEditor(b, item, COLUMU_NAME.length-1); } } /** * * 重新设定TableEditor令其强制更新,此段代码可以注释掉,可以看到效果 * * */ private void setEditor() { for (int key : editorHm.keySet()) { TableEditor editor = editorHm.get(key); Button btn = btnHm.get(key); TableItem item = itemHm.get(key); editor.setEditor(btn, item, COLUMU_NAME.length - 1); } } }
editor的layout可以刷新,我想大家都知道这字面的意思,就是刷新布局,其实就是去获取table的滚动条来计算比例,然后刷新位置,具体实现有兴趣的可以去看看源码;
至于为什么table.notifyListeners(SWT.KeyDown, null);可以达到刷新的效果,那是因为
在tableeditor的父类中,contorlEditor注册了一个事件就是
public class ControlEditor
{
private static final int[] EVENTS = { 1, 2, 3, 4, 11 };
..................
.................
public ControlEditor{
for (int i = 0; i < EVENTS.length; i++) {
parent.addListener(EVENTS[i], this.controlListener);//注册事件
}
..................
.................
}
this.controlListener = new Listener() {
public void handleEvent(Event e) {
ControlEditor.this.layout();//这是刷新布局
}
};
}
所以,当你触发了keydown之后就会自动刷新
同理
table.notifyListeners(1, null);
table.notifyListeners(2, null);
table.notifyListeners(3, null);
table.notifyListeners(4, null);
table.notifyListeners(11, null);
都可以让它们自动对齐。
下附源码:
使用的时候,new一个就可以了
TView table = new TView(shell, 0);
相关推荐
根据提供的文件信息,可以看出本文主要讨论的是如何在 SWT (Standard Widget Toolkit) 的 Table 控件中实现文本换行的功能。SWT 是一个用于开发基于 Java 的桌面应用程序的工具包,它提供了丰富的用户界面组件来帮助...
`TableEditor`是SWT提供的一种编辑器,专门用于处理`Table`中的单元格编辑。在创建`TableEditor`时,需指定其所属的`Table`对象,如下所示: ```java final TableEditor editor = new TableEditor(tablePrice); ```...
- `void refreshTable()`: 刷新表格,根据当前页和每页记录数重新加载数据。 为了进一步完善这个工具类,可以考虑以下改进: - 添加搜索功能,实现对表格数据的过滤,分页时只展示符合搜索条件的记录。 - 实现导出...
在SWT中,我们可以创建一个Shell对象作为应用程序的主窗口,然后在其中添加Table和Chart控件。Table控件可以用来显示数据库中的表格数据,支持排序、筛选等功能;而Chart控件则可以渲染从数据库获取的散点数据。 6...
- `Table.class`:这是SWT库中`Table`类的编译后字节码文件,包含了`Table`类的所有方法和属性定义。 - `Table$1.class`:这是一个内部类,通常用来实现`Table`类的匿名内部回调函数或者其他辅助功能。 - `org....
SWT表格管理类,包括表头排序事件,table宽度自适应事件,隔行颜色事件
在这个场景中,“swt table 自己造个轮子”指的是使用SWT(Standard Widget Toolkit)库来创建一个自定义的表格组件。SWT是Eclipse项目的一部分,它提供了一套原生的GUI组件,用于Java应用程序,提供了与操作系统更...
然后,在创建`TableColumn`时,将其`setEditor`方法设置为我们自定义的`CellEditor`实例,这样就可以在单元格中启用编辑功能。 对于复杂的排序功能,SWT本身提供了基本的单击列头进行排序的能力,但如果我们需要...
在深入探讨“Java SWT Table”这一主题之前,我们先来明确一下SWT(Standard Widget Toolkit)是什么以及它在Java开发中的角色。SWT是Eclipse平台的一部分,它提供了一组用于构建图形用户界面(GUI)的类库。与AWT和...
标题“swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位”表明这个压缩包包含了适用于64位Windows操作系统的SWT库。描述中提到的“64位windows操作系统使用的SWT库”进一步确认了这一点。 SWT的设计目标是...
使Excel嵌入到SWT窗口中 知识点一:Eclipse版本和jdk版本的选择 在本例中,我们使用的是Eclipse 3.3.1版本和jdk 5.0版本。Eclipse是一个开源的集成开发环境(IDE),它支持多种编程语言,包括Java、C++、Python等...
SWT提供了`Table`控件来显示和编辑表格数据。你可以通过`TableItem`来创建和修改表格行,`TableColumn`用于定义列。同时,`Table`控件支持选择模式,如单选或多选,以便用户选择要操作的数据行。 7. 数据绑定: 为了...
org.eclipse.swt.custom.TableEditor.class org.eclipse.swt.custom.TableTree.class org.eclipse.swt.custom.TableTreeEditor.class org.eclipse.swt.custom.TableTreeItem.class org.eclipse.swt.custom....
这可能是因为数据源发生了变化,比如服务器端有新的数据需要同步到客户端,或者用户在界面上进行了某种操作,如添加、删除或修改了某个节点。在这种情况下,我们需要避免重新渲染整个treeview,因为这会消耗不必要的...
SWT(Standard Widget Toolkit)是Java中用于创建图形用户界面(GUI)的一种开源库,它是Eclipse项目的基础组件。SWT的设计目标是提供一个高效、本地化的GUI工具包,能够充分利用操作系统提供的功能,使得Java应用...
SWT(Standard Widget Toolkit)是Eclipse项目的一个重要组成部分,它提供了一套用于构建图形用户界面(GUI)的API,与Java Swing不同,SWT基于操作系统原生的UI组件,因此能够实现更好的性能和与操作系统的集成。...
- **保存配置**:保存运行配置后,每次运行该项目时JRE都会自动加载所需的原生库。 ##### 3. 创建简单的Shell示例 为了验证SWT配置是否正确,可以通过编写一个简单的Shell程序来进行测试。以下是一个基本的Shell...
标题中的"Composer - SWT HTML Editor Widget"是一款专为Eclipse平台设计的开源组件,它集成了Mozilla编辑器的特性,提供了所见即所得(WYSIWYG)的HTML编辑功能。这款工具允许开发者在SWT(Standard Widget Toolkit...
- **TableEditor组件**:用于编辑表格中的单元格。 #### 5. SWT的组件布局 SWT提供了多种布局管理器,如: - **FillLayout**:填充式布局,使组件填满其容器。 - **RowLayout**:行列式布局,按行或列排列组件。 ...