2012-05-08 10 views
0

Java Swingは、MenuItemsのアイコン(存在する場合)の後ろに「メニューテキスト」を配置しているようです。以下の例を参照してください。Java Swing OSXのウィンドウメニューアイコンアライメント

Window Menu on OSX

それは非常に素晴らしい見えません。

これで回避できますか?

OSXでは、アイコンは左余白に収まり、テキストは他のすべてのMenuItemと整列します。

+0

私は理解できませんでしたが、あなたの写真の中にテキストの隣に画像/アイコンはありません。正確に何か、私は行方不明ですか?メインフレーム、環境設定、ページ設定など、あなたの最小化とズームをやり直したいのですか? –

+1

あなたは[SSCCE](http://sscce.org)を持っていますので、自宅のMacで試してみてください – Robin

+0

@nicE cOwメニューのイメージが表示されています。ダイヤモンドアイコンは、ウィンドウが最小化されていることを示します。チェックマーク(チェックマーク)アイコンは、ウィンドウにフォーカスがあることを示します。ドットアイコンは、ウィンドウに保存されていない変更があることを示します。それがAppleの大会です。これらの3つのアイコンは、メニューの左余白にあり、テキスト:メインフレーム、環境設定、およびページ設定は、上記の最小化とズームのテキストに合わせる必要があります。 – Lyndon

答えて

2

は、あなたがこのような何かを意味しています:ここで

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class JTextPaneExample 
{ 
    private Icon info = UIManager.getIcon("OptionPane.informationIcon"); 
    private Icon error = UIManager.getIcon("OptionPane.errorIcon"); 
    private void createAndDisplayGUI() 
    { 
     JFrame frame = new JFrame("JTextPane Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTextPane tpane = new JTextPane(); 
     tpane.setContentType("text/html"); 
     JScrollPane scroller = new JScrollPane(); 
     scroller.setViewportView(tpane); 

     try 
     { 
      java.net.URL url = new java.net.URL("http://maps.google.es/"); 
      //tpane.setPage(url); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     frame.setJMenuBar(createMenuBar()); 

     frame.getContentPane().add(scroller); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    private JMenuBar createMenuBar() 
    { 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu windowMenu = new JMenu("Window"); 
     JMenuItem minimizeItem = new JMenuItem("Minimize"); 
     minimizeItem.setMargin(new java.awt.Insets(0, 10, 0, 0)); 
     minimizeItem.setIcon(info); 
     minimizeItem.setIconTextGap(1); 
     minimizeItem.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); 
     JMenuItem zoomItem = new JMenuItem("Zoom"); 
     zoomItem.setMargin(new java.awt.Insets(0, 10, 0, 0)); 
     zoomItem.setIconTextGap(1); 
     zoomItem.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); 
     JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem("Check Me", null, true);   
     cbmi.setMargin(new java.awt.Insets(5, 25, 5, 5)); 
     cbmi.setIconTextGap(17); 
     cbmi.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); 
     windowMenu.add(minimizeItem); 
     windowMenu.add(zoomItem); 
     windowMenu.add(cbmi); 
     menuBar.add(windowMenu); 
     return menuBar; 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new JTextPaneExample().createAndDisplayGUI(); 
      }   
     }); 
    } 
} 

が出力されます。

MENUITEM

+0

テキストは整列しますが、JCheckBoxMenuItemを使用しています。私は、チェックマーク、ダイヤモンドとドットを使用する必要があります。 JCheckBoxMenuItemが実際にアイコンが表示されるべき場所の左端に配置されているのは面白いです。 – Lyndon

+0

@Lyndon:この新しいコードを試してみてください。私はWindowsを使用していますが、Mac OSではありません。あなた自身をテストすることができますか? –

+0

@Lyndon allルックアンドフィールにはAPIがあり、APIを読んでください。問題がある場合は、あなたの問題を示すSSCCEを投稿してください。あなたの次のものの前に必ずここに-1 – mKorbel

2

あなたはこれらのいずれかの方法を試みることができる:

  • Unicode文字がされています魅力的ですが、可変ピッチフォントでの配置が貧弱です:

    JMenuBar menuBar = new JMenuBar(); 
    JMenu windowMenu = new JMenu("Window"); 
    windowMenu.add(new JMenuItem("♦ Item")); 
    windowMenu.add(new JMenuItem("✓ Item")); 
    windowMenu.add(new JMenuItem("• Item")); 
    menuBar.add(windowMenu); 
    frame.setJMenuBar(menuBar); 
    
  • ベター、Iconインタフェースを実装する、形状を制御するfixed-size実装を使用して、herehereに示します。 CellTestは、任意のユニコード文字をレンダリングする1つの方法を示しています。

+0

+1すばらしい知識のため – mKorbel

+0

絵になると、私は単にあなたの答えに落ちる、彼らは常に知識がいっぱいです:-) –

+0

@trashgod:ありがとうございました。最初の提案は本当に役に立たない。 MenuItemsテキストの配置は依然として間違っています。 2番目の提案にも問題があります。アプリ内の各ウィンドウにMenuItemが必要で、各ウィンドウにいくつかの条件(現在、最小化、汚れ、または非アクティブ)が表示されます。これを行う正しい方法は、JCheckBoxMenuItemから派生したWindowMenuItemを作成し、それをUIManagerに追加することです。このアプローチに関するアイデアは高く評価されます。 – Lyndon