Swing·更改JFrame标题栏图标的上下文菜单字体

时间:2013-11-14 20:24:15

标签: java swing jframe contextmenu titlebar

我想知道如何更改上下文菜单中显示的文本字体,这些字体来自右键单击JFrames标题栏中左侧一直显示的图标,该图标使用默认的装饰外观( JFrame.setDefaultLookAndFeelDecorated(true);)。

我四处搜寻,一无所获。我认为我可以使用我所学到的关于更改标题栏标题字体的知识,但这没有用。

提前致谢。

1 个答案:

答案 0 :(得分: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) {}
    }
}

我受到this帖子使用.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条件应该发生什么,所以应该一次使用一个System.out.println()条件。但这对JFileChooser的标题字体不起作用。当我有时间时,我会深入研究或提出另一个问题。

所以,如果其他人像我一样需要它,那么它就是。作为提示,.toString()和{{1}}是您的朋友!这就是我学习每个对象所包含内容的方式,以及我需要采取什么样的途径来获取感兴趣的对象。

非常感谢!