2

最近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のバグのように見えますか、それとも何かが足りませんか?

4

2 に答える 2

3

バグのようです。テストケースを持ってSWTの人に報告してください。

于 2009-09-24T12:09:15.197 に答える
0

代わりにitem.dispose()を試してください。

于 2009-09-28T14:02:37.760 に答える