Java Swing OSX窗口菜单图标对齐
JavaSwing似乎将“菜单文本”放在MenuItems上的图标(如果存在)之后。见下面的例子 看起来不太好 有办法解决这个问题吗?Java Swing OSX窗口菜单图标对齐,java,macos,swing,icons,jmenuitem,Java,Macos,Swing,Icons,Jmenuitem,JavaSwing似乎将“菜单文本”放在MenuItems上的图标(如果存在)之后。见下面的例子 看起来不太好 有办法解决这个问题吗? 在OSX上,图标位于左边距,文本与所有其他菜单项对齐。您的意思是这样的: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JTextPaneExample { private Icon info = UIManager.getIcon("Op
在OSX上,图标位于左边距,文本与所有其他菜单项对齐。您的意思是这样的:
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();
}
});
}
}
以下是输出:
你的意思是这样的吗:
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();
}
});
}
}
以下是输出:
您可以尝试以下任一方法:
- 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);
- 更好的方法是实现
界面,如图所示,并使用实现来控制几何体。显示了一种呈现任意unicode图示符的方法图标
- 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);
- 更好的方法是实现
界面,如图所示,并使用实现来控制几何体。显示了一种呈现任意unicode图示符的方法图标
JMenuItem
是可能的,但即使对于单个L&F来说也很困难。实现Icon
的优点是对几何图形的利用,如上面更新的链接所示;很抱歉之前的链接不正确@nIcEcOw使用的setIconTextGap()
补充了这一方法。说到绘画,我只是依靠你的答案,他们总是充满知识:-)@trashgood:谢谢你的帮助。第一个建议