2012-01-21 32 views
5

Khi tôi di chuyển JMenuBar của mình vào thanh menu màn hình trên Mac OS X, nó để lại một khoảng trống trong đó menu sẽ nằm trong cửa sổ của tôi; Tôi cần phải loại bỏ không gian đó. Tôi đang sử dụngLàm thế nào để di chuyển JMenuBar của tôi vào thanh trình đơn màn hình trên Mac OS X?

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

để di chuyển JMenuBar vào thanh trình đơn màn hình. Bạn tôi sử dụng một máy Mac báo cáo rằng điều này để lại một số không gian dọc xấu xí, nơi trình đơn sẽ cư trú nếu tôi không thiết lập thuộc tính đó. Cách tốt nhất để giải quyết vấn đề này là gì?

EDIT: Đây là một ví dụ từ nguồn của tôi:

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

bạn có thể gửi mã này? Thông thường, bố cục tự động điều chỉnh để sử dụng tất cả các phòng. – Eelke

Trả lời

11

Tùy thuộc vào khi nó được thực hiện, thiết lập thuộc tính sau ra mắt chương trình của bạn có thể là quá muộn để có hiệu quả. Thay vào đó, hãy thêm cài đặt lúc khởi chạy.

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

Ngoài ra, thiết lập thuộc tính trong ứng dụng bó của bạn Info.plist, như đã thảo luận trong Java Deployment Options for Mac OS X, Java Dictionary Info.plist Keys, About Info.plist KeysJava Runtime System Properties.

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

Phụ Lục: Như hình dưới đây, vấn đề không không xuất hiện bằng cách sử dụng phương pháp được đề xuất bởi @Urs Reupke hoặc bản thân mình. (Thiếu) DesktopMain của bạn có thể bị lỗi.

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

thùng rác, điều đó có vẻ không đúng - tôi đang làm điều đó trong mã của tôi, và tôi vẫn chưa nghe một đơn khiếu nại. –

+0

@UrsReupke: Điểm tốt; đã chỉnh sửa. Tôi không thể tái tạo hiệu ứng, nhưng tôi đã thấy các báo cáo như [this] (http://stackoverflow.com/a/1654547/230513). – trashgod

+0

+1 cho dặm thêm. –

3

Để thay thế cho những gì trashgod gợi ý, làm những gì bạn đang làm - nhưng làm điều đó từ rất sớm, trước khi bạn khởi tạo giao diện người dùng của bạn.

Ngoài ra, bạn có thể xem xét sử dụng này để hiển thị tên ứng dụng của bạn trong quán bar:

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

+1 tnecniv: Vui lòng cung cấp [sscce] (http://sscce.org/) thể hiện sự cố bạn mô tả. – trashgod

+0

@trashgod Tôi đã thêm ví dụ nguồn của mình – tnecniv

+0

@tnecniv: Tôi đã xây dựng [ở đây] (http://stackoverflow.com/a/8956715/230513). – trashgod

0

Đối với Java 8 sử dụng

System.setProperty("apple.awt.application.name", "My app"); 
Các vấn đề liên quan