在最近安装 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 ...
如上所示,堆栈从 DisplaywindowProc
调用到 OS' CallWindowProcW
; 这让我怀疑它与特定于 Windows 7 的 SWT 实现有关。堆栈跟踪最终源自该table.remove(0)
行。
在 Vista、XP 或 Mac OS X 下测试没有问题。
删除SWT.VIRTUAL
样式常量可以解决问题,但不允许在表中使用自定义对象。
看起来这是一个 SWT 错误,还是我遗漏了什么?