2012-01-21 14 views
5

Quando sposto il mio JMenuBar nella barra dei menu dello schermo su Mac OS X, lascia uno spazio vuoto in cui il menu si trova nella mia finestra; Ho bisogno di rimuovere quello spazio. Sto usandoCome si sposta la mia JMenuBar sulla barra dei menu dello schermo su Mac OS X?

System.setProperty("apple.laf.useScreenMenuBar", "true") 

spostare il mio JMenuBar alla barra dei menu dello schermo. Il mio amico che usa un Mac segnala che questo lascia un brutto spazio verticale in cui risiede il menu se non avessi impostato quella proprietà. Qual è il modo migliore per risolvere questo problema?

EDIT: Ecco un esempio dalla mia fonte:

public static void main(String[] args) { 
    System.setProperty("apple.laf.useScreenMenuBar", "true"); 
    System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Name"); 

    JFrame frame = new JFrame("Gabby"); 
    final DesktopMain dm = new DesktopMain(); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(dm); 
    frame.setSize(160, 144); 
    frame.setLocationRelativeTo(null); 
    frame.setIgnoreRepaint(true); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu fileMenu = new JMenu("File"); 
    menuBar.add(fileMenu); 

    // Populating the menu bar code goes here 

    frame.setJMenuBar(menuBar); 
    frame.setVisible(true); 
} 
+1

Potresti postare? Normalmente il layout si regola automaticamente per utilizzare tutta la stanza. – Eelke

risposta

11

A seconda di quando è fatto, impostando la proprietà dopo tuoi avviato il programma potrebbe essere troppo tardi per essere efficace. Invece, aggiungi l'impostazione al momento del lancio.

java -Dapple.laf.useScreenMenuBar=true -jar MyApplication.jar 

In alternativa, impostare la proprietà in del bundle dell'applicazione Info.plist, come discusso in Java Deployment Options for Mac OS X, Java Dictionary Info.plist Keys, About Info.plist Keys e Java Runtime System Properties.

<key>Properties</key> 
<dict> 
    <key>apple.laf.useScreenMenuBar</key> 
    <string>true</string> 
    ... 
</dict> 

Addendum: Come mostrato di seguito, il problema non non appaiono utilizzando l'approccio suggerito da @Urs Reupke o me stesso. Il tuo (mancante) DesktopMain potrebbe essere un errore.

Screen capture

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JPanel; 

/** @see http://stackoverflow.com/questions/8955638 */ 
public class NewMain { 

    public static void main(String[] args) { 
     System.setProperty("apple.laf.useScreenMenuBar", "true"); 
     System.setProperty(
      "com.apple.mrj.application.apple.menu.about.name", "Name"); 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 

       JFrame frame = new JFrame("Gabby"); 
       final JPanel dm = new JPanel() { 

        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(320, 240); 
        } 
       }; 
       dm.setBorder(BorderFactory.createLineBorder(Color.blue, 10)); 

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(dm); 
       frame.pack(); 
       frame.setLocationByPlatform(true); 

       JMenuBar menuBar = new JMenuBar(); 
       JMenu fileMenu = new JMenu("File"); 
       menuBar.add(fileMenu); 
       frame.setJMenuBar(menuBar); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

trashgod, non sembra giusto - lo sto facendo nel mio codice e devo ancora sentire un reclamo. –

+0

@UrsReupke: buon punto; modificato. Non riesco a riprodurre l'effetto, ma ho visto rapporti come [questo] (http://stackoverflow.com/a/1654547/230513). – trashgod

+0

+1 per il miglio supplementare. –

3

In alternativa a ciò che suggerisce trashgod, fare quello che stai facendo - ma farlo molto presto, prima di inizializzare l'interfaccia utente.

Inoltre, si potrebbe considerare l'utilizzo di questa opzione per visualizzare il nome dell'applicazione nella barra:

System.setProperty("com.apple.mrj.application.apple.menu.about.name", "MyApplication"); 
+0

+1 tnecniv: fornire un [sscce] (http://sscce.org/) che mostri il problema che descrivi. – trashgod

+0

@trashgod Ho aggiunto il mio esempio sorgente – tnecniv

+0

@tnecniv: Ho elaborato [qui] (http://stackoverflow.com/a/8956715/230513). – trashgod

0

Per Java 8 uso di questo codice

System.setProperty("apple.awt.application.name", "My app");