Java Swing OSX窗口菜单图标对齐

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

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

看起来不太好

有办法解决这个问题吗?


在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图示符的方法



我不明白,在你的图片中,文本旁边没有图像/图标。我到底错过了什么?你想让你的最小化和缩放刚刚过来,主框架,首选项和页面设置,是吗?你可能有一个这样我就可以在我的Mac上试验它了吗home@nicE现在显示菜单的图像。菱形图标表示窗口最小化。选中标记(勾选)图标表示窗口具有焦点。点图标表示窗口有未保存的更改。这是苹果的惯例。这三个图标应该在菜单的左边距,文本:主框架、首选项和页面设置应该与上面的最小化和缩放文本对齐(左)。@Robin我手头没有SSCCE,但您只需要一个带有菜单和两个菜单项的JFrame。一个带有图标的菜单项,您将拥有演示/测试此功能所需的一切。我认为这是一个Swing“功能”,但这是一个看起来很糟糕的功能…我不明白,在你的图片中,文本旁边没有图像/图标。我到底错过了什么?你想让你的最小化和缩放刚刚过来,主框架,首选项和页面设置,是吗?你可能有一个这样我就可以在我的Mac上试验它了吗home@nicE现在显示菜单的图像。菱形图标表示窗口最小化。选中标记(勾选)图标表示窗口具有焦点。点图标表示窗口有未保存的更改。这是苹果的惯例。这三个图标应该在菜单的左边距,文本:主框架、首选项和页面设置应该与上面的最小化和缩放文本对齐(左)。@Robin我手头没有SSCCE,但您只需要一个带有菜单和两个菜单项的JFrame。一个带有图标的菜单项,您将拥有演示/测试此功能所需的一切。我认为这是一个Swing“功能”,但这是一个看起来很糟糕的功能…文本确实对齐,但您使用了JCheckBoxMenuItem。我需要用一个对勾,一个钻石和一个圆点。有趣的是,JCheckBoxMenuItem实际上被放在左边空白处,正好是图标的位置…@Lyndon:试试这个新代码,我使用的是Windows,而不是Mac OS,所以帮不了你多少忙,也许你可以自己测试一下。请尝试这段新代码:-)@Lyndon all Look and Feel有onw API,read API,如果您有任何问题,请发布一个SSCCE来演示您的问题,一定要在下一个问题之前。。。。这里-1@mKorbel当前位置谢谢你指点我写这篇文章,我今天会学到一些新东西。只是希望我身边也能有一台MAC电脑可以使用,哈哈,但可惜我没有,呵呵:-)@nicE cOw:我试过你的代码,在OSX上它看起来就像一个复选标记。那很好,但是圆点和钻石仍然是个问题。也许,这是有可能实现理想的外观。。。谢谢。文本确实对齐,但您使用了JCheckBoxMenuItem。我需要用一个对勾,一个钻石和一个圆点。有趣的是,JCheckBoxMenuItem实际上被放在左边空白处,正好是图标的位置…@Lyndon:试试这个新代码,我使用的是Windows,而不是Mac OS,所以帮不了你多少忙,也许你可以自己测试一下。请尝试这段新代码:-)@Lyndon all Look and Feel有onw API,read API,如果您有任何问题,请发布一个SSCCE来演示您的问题,一定要在下一个问题之前。。。。这里-1@mKorbel当前位置谢谢你指点我写这篇文章,我今天会学到一些新东西。只是希望我身边也能有一台MAC电脑可以使用,哈哈,但可惜我没有,呵呵:-)@nicE cOw:我试过你的代码,在OSX上它看起来就像一个复选标记。那很好,但是圆点和钻石仍然是个问题。也许,这是有可能实现理想的外观。。。谢谢。说到绘画,我完全依赖你的答案,它们总是充满知识:-)@trashgood:谢谢你的帮助。第一个建议实际上没有帮助。MenuItems文本的对齐方式看起来仍然错误。第二个建议也有问题,因为我需要为应用程序中的每个窗口提供一个菜单项,并且每个窗口都有几个条件之一可以显示(当前、最小化、脏或“非活动”)。我认为正确的方法是创建一个从JCheckBoxMenuItem派生的WindowMenuItem,然后将其添加到UIManager。任何关于这种方法的想法都将不胜感激。是的,扩展
JMenuItem
是可能的,但即使对于单个L&F来说也很困难。实现
Icon
的优点是对几何图形的利用,如上面更新的链接所示;很抱歉之前的链接不正确@nIcEcOw使用的
setIconTextGap()
补充了这一方法。说到绘画,我只是依靠你的答案,他们总是充满知识:-)@trashgood:谢谢你的帮助。第一个建议