com.apple.eawt.Application;
このようにインスタンス化するのに最小限でも使用する場合:
Application app = Application.getApplication ()
デフォルトのMacアプリケーションメニューは誤動作します。
以下の実行可能な最小限のテストコードは、起動時に「Hello World」シェルと、期待どおりに「SWT」というラベルの付いたデフォルトのアプリケーションメニューのみを示しています。
アプリケーションがない場合、「終了」を選択する(またはCommand-Qキーを押す)と、プログラムは通常どおり終了します。
アプリケーションでは、「終了」を選択する(またはCommand-Qキーを押す)と、プログラムは正常に終了するように見えます(たとえば、シェルが消えます)が、「SWT」というラベルの付いたメニューは表示されたままです。武装しておらず、選択もできません。IDE(Idea)によると、私のテストプログラムはまだ実行中であり、IDEを介して終了する必要があります。
私の環境では、これは以下のテストコードで100%再現可能です。
import com.apple.eawt.Application;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class AboutTester
{
public static void main ( String[] args )
{
Display display = new Display ();
Shell shell = new Shell ( display );
shell.setSize ( 300, 200 );
shell.setLayout ( new FillLayout () );
// Comment out the following line - problem goes away.
Application app = Application.getApplication ();
Label label = new Label ( shell, SWT.BORDER_SOLID );
label.setText ( "Hello World" );
shell.open ();
while ( !shell.isDisposed () )
{
if ( !display.readAndDispatch () )
display.sleep ();
}
display.dispose ();
}
}
もちろん、にアクセスできないことcom.apple.eawt.Application;
はMacにとって大きな障害です。
誰かがこの問題の解決策を知っていますか?
完全な開示:(他の観察から)起こっていると思うのは、アプリケーションがメニューを生成していて、SWTがSWTで生成されたメニューで覆っているということです。AboutHandler()をアタッチすると、アプリケーションで生成されたメニューにアタッチされます。したがって、最上位のSWTで生成されたメニューが使用されている場合は機能しないように見えます。SWTメニューが終了すると、アプリケーションで生成されたメニューは孤立したままになります。私のテストアプリは、このアプリケーションで生成されたメニューをクリーンアップする方法を知らないため、ハングします。しかし、それは憶測です。
Mac OS X 10.6.8(10K549)
org.eclipse.swt.cocoa.macosx.x86_64_3.7.0.v3735b.jar
org.eclipse.swt_3.7.1.v3738a.jar
(タイプミスの忍者編集)