Javaアプリケーションを使用して、OSXのシステムトレイ/タスクバーにネイティブな方法でテキストを表示したいと思います。(この例setTitle
のように)を呼び出してこれを実行したいと思います。SWTの基盤となるネイティブライブラリにアクセスしたことがなく、問題が発生しています。NSStatusItem
このスレッドの誰かが、Objective-Cメソッドを呼び出してSWT(フルスクリーンボタン)のウィンドウのプロパティを変更する方法を示しました。これが彼/彼女のコードです:
Field field = Control.class.getDeclaredField("view");
Object /*NSView*/ view = field.get(rShell);
if (view != null)
{
Class<?> c = Class.forName("org.eclipse.swt.internal.cocoa.NSView");
Object /*NSWindow*/ window = c.getDeclaredMethod("window").invoke(view);
c = Class.forName("org.eclipse.swt.internal.cocoa.NSWindow");
Method setCollectionBehavior = c.getDeclaredMethod(
"setCollectionBehavior", JVM.is64bit() ? long.class : int.class);
setCollectionBehavior.invoke(window, getFullScreenMask());
}
したがって、これにより、次のObjective-Cコードが作成されると思います。
[window setCollectionBehaviour:1<<7];
SWTについても同じことをしたいと思いますTrayItem
。目標は、このObjective-Cコードに相当するものを取得することです。
[statusItem setTitle:@"Status"];
しかし、次の例外が発生します。
Exception in thread "main" java.lang.IllegalArgumentException: Can not set org.eclipse.swt.internal.cocoa.NSView field org.eclipse.swt.widgets.Control.view to org.eclipse.swt.widgets.TrayItem
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)
at java.lang.reflect.Field.get(Field.java:358)
at com.teez.status.MainStatus.main(MainStatus.java:35)
これが何を意味するのかわかりません。例外がスローされる行にマークを付けました。これを試みているときに、他にどのような問題が発生する可能性がありますか?これが私のコードです:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;
public class MainStatus {
public static void main(String[] args) throws Exception {
Display display = new Display();
Shell shell = new Shell(display);
Tray tray = display.getSystemTray();
if (tray != null) {
TrayItem item = new TrayItem(tray, SWT.NONE);
Field field = Control.class.getDeclaredField("view");
Object /*NSView*/ view = field.get(item); //Exception thrown here
if (view != null)
{
Class<?> c = Class.forName("org.eclipse.swt.internal.cocoa.NSView");
Object /*NSWindow*/ window = c.getDeclaredMethod("window").invoke(view);
c = Class.forName("org.eclipse.swt.internal.cocoa.NSStatusItem");
Method setCollectionBehavior = c.getDeclaredMethod("setTitle", long.class);
setCollectionBehavior.invoke(window, "Desired title");
}
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}
}
編集:この問題を解決してくれたEugeneに感謝しますが、テキストがまだステータスバーに表示されないので、ここで別の質問をしました。