Swing · Изменение шрифта контекстного меню значка заголовка JFrame

Я хочу знать, как изменить шрифт текста, который появляется в контекстном меню, созданном при щелчке правой кнопкой мыши по значку, который полностью слева в строке заголовка JFrames, которые используют внешний вид по умолчанию для украшения (JFrame.setDefaultLookAndFeelDecorated(true);).

Я искал вокруг и ничего не нашел. Я думал, что смогу использовать то, что узнал об изменении шрифта заголовка строки заголовка, но это не сработало.

Заранее спасибо.


person GuiRitter    schedule 14.11.2013    source источник
comment
Заранее спасибо. Эээ... не за что. Но у вас есть вопрос?   -  person Andrew Thompson    schedule 15.11.2013
comment
@AndrewThompson Я думаю, что вопрос должен заключаться в длинном первом абзаце.   -  person async    schedule 15.11.2013
comment
Рамки фреймов и значки обычно предоставляются ОС, что выходит за рамки нашего контроля. Какой внешний вид вы используете? Нимб или металл?   -  person MadProgrammer    schedule 15.11.2013
comment
@MadProgrammer Metal, как я уже сказал, для украшения используется внешний вид по умолчанию, как в JFrame.setDefaultLookAndFeelDecorated(true);. Как я уже сказал, я изменил шрифт заголовка, поэтому я могу изменить (по крайней мере, некоторые) украшения.   -  person GuiRitter    schedule 15.11.2013
comment
Внешний вид по умолчанию для Java 7 — Nimbus, поэтому просьба разъяснить   -  person MadProgrammer    schedule 15.11.2013
comment
@MadProgrammer AFAIK, только если вы используете конструктор графического интерфейса и позволяете ему выполнять работу без присмотра. Если я делаю все сам, по умолчанию всегда был Metal, начиная с v1.7.0_25.   -  person GuiRitter    schedule 15.11.2013
comment
Это правда, но разница имеет значение ;)   -  person MadProgrammer    schedule 15.11.2013


Ответы (1)


После еще нескольких возни, я, наконец, сделал это! Мне так нравится Java, что мне немного грустно, как сложно делать такие вещи. Во всяком случае, я нашел метод здесь для рекурсивного изменения шрифт всех компонентов из JFileChooser, но он не работает с JPopupMenu (теперь я знаю имя), которое появляется из значка заголовка. Итак, я возился с этим методом, использовал некоторый кастинг и смог изменить шрифт JMenuItems:

public static void setSubComponentFont (Component comp[], Font font) {
    for (int x = 0; x < comp.length; x++) {
        if (comp[x] instanceof Container) {
            setSubComponentFont(((Container)comp[x]).getComponents(), font);
        }  
        try {
            //comp[x].setFont(font);
            if (comp[x].toString().contains("JMenu")) {
                for (Component y : ((JMenu)comp[x]).getPopupMenu().getComponents()) {
                    if (y.toString().contains("JMenu")) {
                        y.setFont(font);
                    }
                }
            }
        } catch (Exception ex) {}
    }
}

На использование .toString().contains() меня вдохновила эта ветка.

Я также сделал это с вложенными циклами, чтобы путь к пунктам меню был виден:

for (Component a : frame.getLayeredPane().getComponents()) {
    System.out.println(a.toString());
    if (a.toString().contains("MetalTitlePane")) {
        for (Component b : ((Container)a).getComponents()) {
            System.out.println(b.toString());
            if (b.toString().contains("SystemMenuBar")) {
                for (Component c : ((Container)b).getComponents()) {
                    System.out.println(c.toString());
                    for (Component d : ((JMenu)c).getPopupMenu().getComponents()) {
                        System.out.println(d.toString());
                        if (d.toString().contains("JMenu")) {
                            d.setFont(font);
                        }
                    }
                }
            }
        }
    }
}

Каждый System.out.println() дает подсказку к тому, что должно происходить при следующем if условии, поэтому их следует использовать по одному. Однако это не работает для шрифта заголовка JFileChooser. Когда у меня будет время, я либо углублюсь в это, либо задам другой вопрос.

Так что, если кому-то это нужно, как и мне, вот оно. Совет: System.out.println() и .toString() — ваши друзья! Так я узнал, что содержится в каждом объекте, и какой путь мне нужно пройти, чтобы добраться до интересующих объектов.

Спасибо, в любом случае!

person GuiRitter    schedule 18.11.2013