2013-11-14 7 views
0

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

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

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

+1

* «Заранее спасибо». * Err .. добро пожаловать. Но есть ли у вас вопрос? –

+0

@AndrewThompson Я думаю, что долгий первый параграф должен быть вопросом. – async

+1

Границы рамки и значки обычно поставляются операционной системой, которая вынимает часть нашего контроля. Какой внешний вид и вы используете? Нимбус или металл? – MadProgrammer

ответ

0

После того, как я снова обманул, я, наконец, сделал это! Мне нравится Java так сильно, что мне немного грустно, как тяжело это делать. В любом случае, я нашел метод here для рекурсивного изменения шрифта всех компонентов из 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() по this нити.

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

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() - ваши друзья! Вот как я узнал, что содержится в каждом объекте, и какой путь мне нужно взять, чтобы добраться до объектов, представляющих интерес.

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

Смежные вопросы