最近Windows7Professionalをインストールした後、SWTの入力済みテーブルからTableItemを削除する際に奇妙な問題が発生します。これは、Windows7および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
呼び出しからOSへのサイクルを繰り返しCallWindowProcW
ます。これは、SWTのWindows7固有の実装と関係があるのではないかと私に思わせます。スタックトレースは、最終的にはtable.remove(0)
回線から発生します。
Vista、XP、またはMacOSXでテストしても問題はありません。
スタイル定数を削除SWT.VIRTUAL
すると問題は解決しますが、テーブルにカスタムオブジェクトを含めることはできません。
これはSWTのバグのように見えますか、それとも何かが足りませんか?