0

装飾にデフォルトのルック アンド フィールを使用する JFrames のタイトルバーの左端にあるアイコンを右クリックして、コンテキスト メニューに表示されるテキストのフォントを変更する方法を知りたいです ( JFrame.setDefaultLookAndFeelDecorated(true);)。

私は周りを探しましたが、何も見つかりませんでした。タイトルバーのタイトルのフォント変更について学んだことを活かせると思ったのですが、うまくいきませんでした。

前もって感謝します。

4

1 に答える 1

0

いろいろいじった結果、やっとできました!私は 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);
                        }
                    }
                }
            }
        }
    }
}

Everyは、次の条件でSystem.out.println()何をすべきかのヒントを与えるので、一度に 1 つずつ使用する必要があります。ifただし、これは JFileChooser のタイトル フォントでは機能しません。時間ができたら、さらに詳しく調べるか、別の質問をします。

だから、私のように他の誰かがそれを必要とするなら、ここにあります. ヒントとして、System.out.println()あなた.toString()の友達です!このようにして、各オブジェクトに何が含まれているか、目的のオブジェクトに到達するために必要なパスを学習しました。

とにかくありがとう!

于 2013-11-18T19:53:35.303 に答える