После еще нескольких возни, я, наконец, сделал это! Мне так нравится 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
JFrame.setDefaultLookAndFeelDecorated(true);
. Как я уже сказал, я изменил шрифт заголовка, поэтому я могу изменить (по крайней мере, некоторые) украшения. - person GuiRitter   schedule 15.11.2013