6

Macアプリケーションを作成していますが、メニューバーを正しく表示したいと思います。

Macユーザーなら誰でも、メニューバーをトップスクリーンメニューに表示する必要があることを知っています。プロパティリストファイルでをに設定apple.laf.useScreenMenuBarするtrueと、フレーム内のメニューバーが削除され、現在フォーカスされているウィンドウのメニューバーが画面メニューに移動します。

ただし、すべてのウィンドウが非表示になっている場合、またはウィンドウがない場合は、一番上に移動するメニューバーがなく、空白のメニューが表示されます。これに対する解決策は、他の人がいないときにフォーカスされるオフスクリーンウィンドウを作成することだと聞きました。それの唯一の目的は、他の人がいなくなったときにそれが記入できるように、そのメニューです。

しかし、私はたくさんの問題を抱えています。Macでは座標を画面のサイズを超える値に設定できないため、ウィンドウを画面から移動できないようです。切り取って、代わりに端に配置します。オフスクリーンウィンドウを作成するために他に何かしなければならないことはありますか?

4

6 に答える 6

4

WizardOfOddsの非常に役立つ答えを必ず検討する必要があります。「アプリケーションメニュー」を正しく使用すると役立ち、最小限の設定を簡単にInfo.plist開始できます。永続的なFileメニューを使用すると、他のウィンドウを閉じたときにアプリケーションで新しいウィンドウを開くことができます。この回答は簡単なにリンクしています。

Appleのヒューマンインターフェイスガイドラインは、ユーザーが期待することへの優れたガイドですが、質問で提案したアプローチを試すことができます。特に、setLocation(Short.MIN_VALUE, Short.MIN_VALUE)非表示のウィンドウを試してみることができます。さらにWindowEvent、最後に表示されたウィンドウの終了を通知する場合は、特別な方法で応答することをお勧めします。

補遺:リスナーが最後に表示されたウィンドウが閉じていることを確認したら、新しい空のアプリケーションウィンドウを作成します。または、非表示のウィンドウを画面上に移動し、ユーザーが続行する方法を決定するまで表示します。

補遺:Mac OS Xは、表示されているウィンドウフォームが画面外に移動するのを防ぐのに役立ちますが、以下に示すように、非表示のウィンドウを簡単に配置できます

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

public class FrameTest extends JFrame {

    private static FrameTest marco;
    private static FrameTest polo;

    private static class MyPanel extends JPanel {

        public MyPanel() {
            super(true);
            final JToggleButton b = new JToggleButton("Test");
            b.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if (b.isSelected()) {
                        polo.setLocation(100, 100);
                        polo.setVisible(true);
                    }
                    else {
                        polo.setVisible(false);
                        polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
                    }
                }
            });
            this.add(b);
        }
    }

    public FrameTest(String title) {
        super(title);
        this.setLayout(new BorderLayout());
        this.add(new MyPanel());
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                marco = new FrameTest("Marco");
                marco.setLocationRelativeTo(null);
                marco.setVisible(true);
                polo = new FrameTest("Polo");
                polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
            }
        });
    }
}
于 2010-02-03T00:57:23.450 に答える
1

私はこの投稿がかなり古いことを知っています、とにかく、私は同じ問題を抱えていて、解決策を見つけました。実際、それは非常に簡単です。mac os xで実行しているときは、メインフレームにJMenuBarを追加しないでください。ただし、を使用してアプリケーションに追加してください

com.apple.eawt.Application.getApplication().setDefaultMenuBar(menuBar);

これで、すべてのフレームの可視性をfalseに設定しても、メニューバーが表示されます。

于 2012-08-10T17:11:50.883 に答える
0

最初の注意:あなたの質問は本当に「Appleヒューマンインターフェイスガイドラインに従ってウィンドウメニューを作成する方法」であり、巨大なハックのように見える「Javaでオフスクリーンフレームを作成する」ではないようです。

Appleの「MacOSXIntegration for Java」をチェックすることをお勧めします。これは、「ウィンドウメニュー」の下に、あなたが達成しようとしていることを明らかに正確に示しています。

Appleヒューマンインターフェイスガイドラインは、すべてのMac OS Xアプリケーションが、現在開いているすべてのウィンドウを追跡するためのウィンドウメニューを提供する必要があることを示唆しています。ウィンドウメニューには、アクティブなウィンドウの横にチェックマークが付いたウィンドウのリストが含まれている必要があります。

于 2010-02-02T18:06:43.477 に答える
0

直接的な解決策ではありませんが、代わりに1ピクセルのウィンドウを作成するものもあると思います。ただし、スーパーユーザーで説明されているように、不満が生じます。iMac24のドット抜けの混沌とし​​た動作...

于 2010-02-02T22:08:13.780 に答える
0

これはtrashgodの答えへのコメントです。大きすぎるのでここに移動する必要があります>。<


より多くの問題!

2つのエラーが発生します:

line 23: The method itemStateChanged(ItemEvent) of type new ItemListener(){} must override a superclass method

line 50:The method run() of type new Runnable(){} must override a superclass method

何か助けはありますか?私はこれまでこれに遭遇したことがありません。それが何を意味するのかわかりません。

編集:私はもっと問題があります!画面のメニューバーに移動するメニューを生成するには、画面外のウィンドウが画面外にあるときに表示される必要があります。コードを使うとき

offScreen = new JFrame("WTF?!  You can see me?");
offScreen.setSize(400,300);
offScreen.setLocation(0, java.awt.Toolkit.getDefaultToolkit().getScreenSize().height+50);
System.out.println(offScreen.getLocation());
offScreen.setVisible(true);
System.out.println(offScreen.getLocation());

出力を取得します:

java.awt.Point[x=0,y=1100]
java.awt.Point[x=0,y=961]

再び表示されると、元に戻ります。

年齢を検索しましたが、何も見つかりません。

于 2010-02-03T17:16:07.387 に答える
0

このコードはJava7で機能します。

if( isMac ) {
    //This creates an invisible frame so that we always have a menu bar visible
    JFrame menuFrame = new JFrame();
    menuFrame.setUndecorated( true );
    menuFrame.setJMenuBar( defaultMenuBar );
    AWTUtilities.setWindowOpaque( menuFrame, false );
    menuFrame.setBounds( 0,0,1,1 );
    menuFrame.setVisible( true );
}

他のウィンドウを開く前にこれを呼び出すだけで、バックグラウンドに留まり、他のウィンドウを閉じると自動的にフォーカスされたウィンドウになります。アプリケーションでcom.apple.eawt.Application.getApplication()。setDefaultMenuBar(menuBar)メソッドを引き続き使用できるため、各JFrameでsetJMenuBar()を呼び出す必要はありません。

于 2013-03-01T16:37:40.840 に答える