Вопрос по macos, swing, java – Выравнивание значков в меню окна Java Swing OSX

0

Java Swing, кажется, помещает «текст меню»; после значка (если имеется) в элементах меню. Смотрите пример ниже.

Window Menu on OSX

Это не выглядит очень красиво.

Is there a way around this?

В OSX значок помещается в левое поле, а текст выравнивается со всеми остальными элементами меню.

@nicE COw Изображение для меню отображается сейчас. Значок ромба означает, что окно свернуто. Значок галочки (галочка) означает, что окно имеет фокус. Значок точки означает, что в окне есть несохраненные изменения. Это соглашение Apple. Эти три значка должны находиться в левом поле меню, а тексты: «Основной кадр», «Предпочтения» и «Параметры страницы» должны быть выровнены (слева) с текстами «Свернуть» и «Увеличение» выше. Lyndon
Я не могу понять, что на указанном изображении рядом с текстом нет изображения / значка. Что именно, мне не хватает? Вы хотите, чтобы минимизировать и увеличить масштаб, основной кадр, настройки и настройки страницы, не так ли? nIcE cOw
Возможно, у вас естьSSCCE так что я могу экспериментировать с этим на моем Mac дома Robin
@ Робин У меня нет SSCCE, но все, что вам нужно, это JFrame с меню и двумя пунктами MenuItem. Один элемент MenuItem со значком, и у вас будет все необходимое для демонстрации / проверки этого. Я думаю, что это особенность Swing. но это особенность, которая выглядит ужасно ... Lyndon

Ваш Ответ

2   ответа
2

Unicode characters are appealing, but they offer poor alignment in a variable pitch font:

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

Better, implement the Icon interface, illustrated here and here, using a fixed-size implementation to control geometry. CellTest shows one approach to rendering an arbitrary unicode glyph.

Когда дело доходит до рисования, я просто возвращаюсь к вашим ответам, они всегда полны знаний :-)
+1 за великие знания
Да, продолжаяJMenuItem возможно, но это трудоемко даже для одного L & F; Преимущество реализацииIcon является рычагом над геометрией, как показано в обновленной ссылке выше; извините за неправильную ссылку ранее. @ nIcEcOw 's использованиеsetIconTextGap() дополняет подход.
@trashgod: Спасибо за вашу помощь. Первое предложение не помогает на самом деле. Выравнивание текста MenuItems по-прежнему выглядит неправильно. Второе предложение также имеет проблемы, так как мне нужен MenuItem для каждого окна в приложении, и каждое окно будет иметь одно из нескольких условий для отображения (текущее, свернутое, грязное или «неактивное»). Я чувствую, что правильный способ сделать это - создать WindowMenuItem, производный от JCheckBoxMenuItem, и затем добавить его в UIManager. Любые идеи по этому подходу будут оценены. 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

@mKorbel: Спасибо, что указали мне на этот пост, узнаете что-то новое сегодня. Просто хочу, чтобы у меня тоже был один MAC для работы, LOL, но, увы, я лишен одного, хе-хе :-)
@ Lyndon all Look and Feel имеет onw API, read API, и если вы будете сообщать о любой проблеме, опубликуйте SSCCE, демонстрирующую вашу проблему, обязательно перед вашей следующей ... здесь -1
@ Линдон: попробуйте этот новый код, я использую Windows, я не на Mac OS, так что не могу вам сильно помочь, возможно, вы можете проверить себя. Попробуйте этот новый код, пожалуйста :-)
Текст выравнивается, но вы использовали JCheckBoxMenuItem. Мне нужно использовать галочку, ромб и точку. Интересно, что JCheckBoxMenuItem фактически размещен в левом поле именно там, где должен быть значок ... Lyndon
@nicE COw: я попробовал ваш код и на OSX он выглядит как галочка. Это здорово, но точка и бриллиант все еще являются проблемой. Может быть, можно добиться желаемого взгляда ... Спасибо. Lyndon

Похожие вопросы