java - ¿Cómo muevo mi JMenuBar a la barra de menú de la pantalla en Mac OS X?
osx swing (3)
Como alternativa a lo que sugiere basura, haz lo que estás haciendo, pero hazlo muy temprano, antes de inicializar tu UI.
Además, puede considerar usar esto para mostrar el nombre de su aplicación en la barra:
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "MyApplication");
Cuando muevo mi JMenuBar
a la barra de menú de la pantalla en Mac OS X, deja un espacio en blanco donde el menú estaría en mi ventana; Necesito eliminar ese espacio. estoy usando
System.setProperty("apple.laf.useScreenMenuBar", "true")
para mover mi JMenuBar
a la barra de menú de la pantalla. Mi amigo que usa una Mac informa que esto deja un feo espacio vertical donde residiría el menú si no establecí esa propiedad. ¿Cuál es la mejor manera de resolver este problema?
EDITAR: Aquí hay un ejemplo de mi fuente:
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);
}
Dependiendo de cuándo lo haga, configurar la propiedad después de que se inicie el programa puede ser demasiado tarde para que sea efectiva. En su lugar, agregue la configuración en el momento del lanzamiento.
java -Dapple.laf.useScreenMenuBar=true -jar MyApplication.jar
Como alternativa, establezca la propiedad en Info.plist
su paquete de Info.plist
, como se explica en Opciones de implementación de Java para Mac OS X , Teclas Info.plist de Java Dictionary , Acerca de claves Info.plist y Propiedades del sistema Java Runtime .
<key>Properties</key>
<dict>
<key>apple.laf.useScreenMenuBar</key>
<string>true</string>
...
</dict>
Adición: Como se muestra a continuación, el problema no aparece utilizando el enfoque sugerido por @Urs Reupke o por mí mismo. Su (faltante) DesktopMain
puede tener la culpa.
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://.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);
}
});
}
}
Para Java 8 usa esto
System.setProperty("apple.awt.application.name", "My app");