`

SWT tableEditor删除后刷新

阅读更多

在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);

 

 

 

  • 大小: 7.1 KB
  • 大小: 4.1 KB
分享到:
评论

相关推荐

    swt table 实现换行

    根据提供的文件信息,可以看出本文主要讨论的是如何在 SWT (Standard Widget Toolkit) 的 Table 控件中实现文本换行的功能。SWT 是一个用于开发基于 Java 的桌面应用程序的工具包,它提供了丰富的用户界面组件来帮助...

    SWT Table单元格编辑功能

    `TableEditor`是SWT提供的一种编辑器,专门用于处理`Table`中的单元格编辑。在创建`TableEditor`时,需指定其所属的`Table`对象,如下所示: ```java final TableEditor editor = new TableEditor(tablePrice); ```...

    SWT Table分页的工具类

    - `void refreshTable()`: 刷新表格,根据当前页和每页记录数重新加载数据。 为了进一步完善这个工具类,可以考虑以下改进: - 添加搜索功能,实现对表格数据的过滤,分页时只展示符合搜索条件的记录。 - 实现导出...

    JAVA SWT Table SWTChart Jdbc 数据 表格 散点图 界面

    在SWT中,我们可以创建一个Shell对象作为应用程序的主窗口,然后在其中添加Table和Chart控件。Table控件可以用来显示数据库中的表格数据,支持排序、筛选等功能;而Chart控件则可以渲染从数据库获取的散点数据。 6...

    swt类库Table

    - `Table.class`:这是SWT库中`Table`类的编译后字节码文件,包含了`Table`类的所有方法和属性定义。 - `Table$1.class`:这是一个内部类,通常用来实现`Table`类的匿名内部回调函数或者其他辅助功能。 - `org....

    SWT表格管理类(包括表头排序,隔行颜色,表格宽度自适应)

    SWT表格管理类,包括表头排序事件,table宽度自适应事件,隔行颜色事件

    swt table 自己造个轮子

    在这个场景中,“swt table 自己造个轮子”指的是使用SWT(Standard Widget Toolkit)库来创建一个自定义的表格组件。SWT是Eclipse项目的一部分,它提供了一套原生的GUI组件,用于Java应用程序,提供了与操作系统更...

    swt table扩展

    然后,在创建`TableColumn`时,将其`setEditor`方法设置为我们自定义的`CellEditor`实例,这样就可以在单元格中启用编辑功能。 对于复杂的排序功能,SWT本身提供了基本的单击列头进行排序的能力,但如果我们需要...

    java swt table

    在深入探讨“Java SWT Table”这一主题之前,我们先来明确一下SWT(Standard Widget Toolkit)是什么以及它在Java开发中的角色。SWT是Eclipse平台的一部分,它提供了一组用于构建图形用户界面(GUI)的类库。与AWT和...

    使Excel嵌入到SWT窗口中

    使Excel嵌入到SWT窗口中 知识点一:Eclipse版本和jdk版本的选择 在本例中,我们使用的是Eclipse 3.3.1版本和jdk 5.0版本。Eclipse是一个开源的集成开发环境(IDE),它支持多种编程语言,包括Java、C++、Python等...

    swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位

    标题“swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位”表明这个压缩包包含了适用于64位Windows操作系统的SWT库。描述中提到的“64位windows操作系统使用的SWT库”进一步确认了这一点。 SWT的设计目标是...

    SWT增删改查

    SWT提供了`Table`控件来显示和编辑表格数据。你可以通过`TableItem`来创建和修改表格行,`TableColumn`用于定义列。同时,`Table`控件支持选择模式,如单选或多选,以便用户选择要操作的数据行。 7. 数据绑定: 为了...

    org.eclipse.swt.win32

    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....

    SWT使用例子

    SWT(Standard Widget Toolkit)是Java中用于创建图形用户界面(GUI)的一种开源库,它是Eclipse项目的基础组件。SWT的设计目标是提供一个高效、本地化的GUI工具包,能够充分利用操作系统提供的功能,使得Java应用...

    SWT源码 swt.jar

    SWT(Standard Widget Toolkit)是Eclipse项目的一个重要组成部分,它提供了一套用于构建图形用户界面(GUI)的API,与Java Swing不同,SWT基于操作系统原生的UI组件,因此能够实现更好的性能和与操作系统的集成。...

    SWT配置 SWT配置 SWT配置 SWT配置 SWT配置

    - **保存配置**:保存运行配置后,每次运行该项目时JRE都会自动加载所需的原生库。 ##### 3. 创建简单的Shell示例 为了验证SWT配置是否正确,可以通过编写一个简单的Shell程序来进行测试。以下是一个基本的Shell...

    Composer - SWT HTML Editor Widget-开源

    标题中的"Composer - SWT HTML Editor Widget"是一款专为Eclipse平台设计的开源组件,它集成了Mozilla编辑器的特性,提供了所见即所得(WYSIWYG)的HTML编辑功能。这款工具允许开发者在SWT(Standard Widget Toolkit...

    Eclipse SWT 开发参考

    - **TableEditor组件**:用于编辑表格中的单元格。 #### 5. SWT的组件布局 SWT提供了多种布局管理器,如: - **FillLayout**:填充式布局,使组件填满其容器。 - **RowLayout**:行列式布局,按行或列排列组件。 ...

    Java swt完整教程

    JFace是建立在SWT之上的抽象层,简化了SWT的使用,提供了一些高级组件,如对话框(Dialog)、视图(View)、编辑器(Editor)等。同时,JFace还提供数据绑定、表单构建等功能。 6. SWT与Eclipse RCP Eclipse Rich...

Global site tag (gtag.js) - Google Analytics