Java Swing OSX窗口菜单图标对齐

Java Swing似乎在MenuItems上的图标(如果存在)之后放置了“菜单文本”。 见下面的例子。

OSX上的窗口菜单

它看起来不是很好。

有没有解决的办法?

在OSX上,图标适合左边距,文本与所有其他MenuItem对齐。

你的意思是这样的:

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

您可以尝试以下任一种方法:

  • 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界面, 这里和这里说明,使用固定大小的实现来控制几何。 CellTest显示了一种渲染任意unicode字形的方法。