MacのJPopupmenuに3つの問題があります。すべて、同封のJavaプログラムまたはnetbeansJavaアプリケーションなどで再現できます。
まず、ポップアップメニューが表示されたときにJavaアプリケーションがドックをブロックしないことです。したがって、Javaアプリケーションを右クリックしてポップアップメニューを開くと、マウスをドック領域に移動するとドックが表示されます。Java以外のアプリケーション(Outlook、Textwrangler、Finder ...)では、これらのアプリケーションにコンテキストメニューが表示されている場合、ドックは表示されません。
Javaアプリケーションを「ネイティブ」OSXアプリケーションのように動作させて、ドックがこのコンテキストで表示されないようにする方法はありますか?
次の問題はもっと厄介です。コンテキストメニューがJavaアプリケーションによって表示され、ユーザーが別のアプリケーション(たとえばOutlook)に切り替えた場合(cmd-TABまたはドック)、Javaアプリケーションのコンテキストメニューは他のアプリケーションウィンドウの上に表示されたままになります。
別のアプリケーションにフォーカスがある場合、Javaアプリケーションのポップアップメニューを非表示にする方法はありますか?
そして最後の問題。アプリケーションがNetBeansの前にあり、NetBeansウィンドウを右クリックすると、NetBeansのポップアップメニューが表示されますが、メニュー項目の上にマウスを移動しても、メニュー項目は強調表示されません。マウスを押すことでメニュー項目を選択できますが、メニュー項目の上にマウスを移動すると、それらは強調表示されません。
メニュー項目が強調表示されないのはなぜですか、回避策はありますか?
Mac OS X 10.6.8 Java:1.6.0_35
package popupmenu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
public class PopupMenuApp {
private JPopupMenu popup;
private class PopupListener extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
private void start() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
popup = new JPopupMenu();
popup.add(new JMenuItem("A popup menu item"));
frame.addMouseListener(new PopupListener());
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setAlwaysOnTop(true);
}
});
}
public static void main(String[] args) {
PopupMenuApp app = new PopupMenuApp();
app.start();
}
}