代码之家  ›  专栏  ›  技术社区  ›  Paul Lammertsma

swt.virtual的swt表引发stackoverflowError

  •  2
  • Paul Lammertsma  · 技术社区  · 15 年前

    在最近安装了Windows7Professional之后,我在SWT中从填充的表中删除TableItem时遇到了一个奇怪的问题。它特定于Windows 7和 SWT.VIRTUAL 表的样式常量。

    请考虑以下代码:

    table = new Table(parent, SWT.VIRTUAL | Skin.SCROLL_STYLE |
                              SWT.FULL_SELECTION | SWT.BORDER);
    TableItem item = new TableItem(table, SWT.NONE);
    item.setText("Table item");
    table.remove(0);
    

    这会导致stackOverflowError,如下所示:

    Caused by: java.lang.StackOverflowError
        at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method)
        at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2312)
        at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:334)
        at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:200)
        at org.eclipse.swt.widgets.Control.windowProc(Control.java:4036)
        at org.eclipse.swt.widgets.Table.windowProc(Table.java:5520)
        at org.eclipse.swt.widgets.Display.windowProc(Display.java:4602)
        at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method)
        at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3106)
        at org.eclipse.swt.widgets.Table.wmNotifyChild(Table.java:6319)
        at org.eclipse.swt.widgets.Control.wmNotify(Control.java:4877)
        at org.eclipse.swt.widgets.Composite.wmNotify(Composite.java:1757)
        at org.eclipse.swt.widgets.Control.WM_NOTIFY(Control.java:4507)
        at org.eclipse.swt.widgets.Control.windowProc(Control.java:4000)
        at org.eclipse.swt.widgets.Display.windowProc(Display.java:4602)
        at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method)
        at ...
    

    如上图所示,堆栈从显示器的 windowProc 呼叫操作系统 CallWindowProcW ;这让我怀疑它与Windows7特定的SWT实现有关。堆栈跟踪最终源于 table.remove(0) 线。

    在vista、xp或mac os x下测试没有问题。

    去掉 虚拟现实 样式常量解决了问题,但不允许在表中使用自定义对象。

    这似乎是一个SWT错误,还是我错过了什么?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Aaron Digulla    15 年前

    看起来像个虫子。用测试案例向SWT人员报告。

        2
  •  0
  •   Brad    15 年前

    改为尝试item.dispose()?