SWT表与SWT.VIRTUAL引发StackOverflowError

时间:2009-09-24 11:40:12

标签: java windows-7 swt stack-overflow

在最近安装Windows 7 Professional之后,我在从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循环;这让我怀疑它与Windows 7特定的SWT实现有关。堆栈跟踪最终来自table.remove(0)行。

在Vista,XP或Mac OS X下进行测试没有任何问题。

删除SWT.VIRTUAL样式常量可以解决问题,但不允许表中的自定义对象。

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

2 个答案:

答案 0 :(得分:3)

看起来像个错误。用测试用例向SWT人员报告。

答案 1 :(得分:0)

尝试使用item.dispose()?