【问题标题】:Java Swing OSX Window Menu Icon AlignmentJava Swing OSX 窗口菜单图标对齐
【发布时间】:2012-05-17 04:28:32
【问题描述】:

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

看起来不是很好。

有没有办法解决这个问题?

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

【问题讨论】:

  • 我无法理解,您的上述图片中没有图像/图标,在文本旁边。究竟是什么,我错过了什么?你想让你的最小化和缩放刚刚结束,主框架,首选项和页面设置,是这样吗?
  • 您是否有SSCCE 以便我可以在家里的 Mac 上进行试验
  • @nicE cOw 现在正在显示菜单的图像。菱形图标表示窗口已最小化。复选标记(勾号)图标表示窗口具有焦点。圆点图标表示窗口有未保存的更改。这是苹果的惯例。这三个图标应该在菜单的左边距并且文本:Main Frame、Preferences 和 Page Setup 应该与上面的 Minimize 和 Zoom 文本对齐(左)。
  • @Robin 我手头没有SSCCE,但您只需要一个带有一个菜单和两个MenuItem 的JFrame。一个带有图标的 MenuItem,您将拥有演示/测试所需的一切。我认为这是一个 Swing 的“功能”,但它看起来很糟糕......

标签: java macos swing icons jmenuitem


【解决方案1】:

你的意思是这样的吗:

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();
            }           
        });
    }
}

这是输出:

【讨论】:

  • 文本确实对齐,但您使用了 JCheckBoxMenuItem。我需要使用复选标记、菱形和圆点。有趣的是,JCheckBoxMenuItem 实际上被放置在左边距,正好是图标应该在的位置...
  • @Lyndon :试试这个新代码,我使用的是 Windows,而不是 Mac OS,所以对你没有多大帮助,也许你可以自己测试一下。请试试这个新代码:-)
  • @Lyndon 所有 Look and Feel 都有 onw API,read API,如果您有任何问题发布 SSCCE 来展示您的问题,请确保在您的任何下一个之前......这里 -1
  • @mKorbel :谢谢你把我指向这篇文章,今天会学到一些新东西。只是希望我身边也能有一个 MAC 来工作,哈哈,但可惜我没有一个,呵呵 :-)
  • @nicE cOw :我试过你的代码,在 OSX 上它看起来就像一个复选标记。这很好,但圆点和菱形仍然是个问题。也许,有可能实现所需的外观......谢谢。
【解决方案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 接口,说明herehere,使用fixed-size 实现来控制几何。 CellTest 展示了一种渲染任意 unicode 字形的方法。

【讨论】:

  • 说到绘画,我只是依靠你的答案,他们总是充满知识:-)
  • @trashgod:感谢您的帮助。第一个建议真的没有帮助。 MenuItems 文本的对齐方式看起来仍然错误。第二个建议也有问题,因为我需要为应用程序中的每个窗口提供一个 MenuItem,并且每个窗口都将显示几个条件之一(当前、最小化、脏或“非活动”)。我觉得这样做的正确方法是创建一个从 JCheckBoxMenuItem 派生的 WindowMenuItem,然后将其添加到 UIManager。对此方法的任何想法将不胜感激。
  • 是的,扩展JMenuItem 是可能的,但即使是单个L&F 也很费力。实现Icon 的优点是对几何的影响,如上面更新的链接所示;很抱歉之前的链接不正确。 @nIcEcOw 使用 setIconTextGap() 补充了该方法。
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多