1

アプリのフォントを通常のサイズから大きいサイズに切り替えるユーザーをサポートするために、Java Swing アプリケーションを更新しています (ユーザーは実行時に 2 つのサイズを切り替えることができます)。私が抱えている問題の 1 つは、ツリー ノードに HTML を使用して一部のノードのテキストに下線を引く JTree に関するものです (HTML は各ツリー ノードの JLabel に埋め込まれているだけです)。ノードについて知っておくべきもう 1 つのことは、ノードがカスタム コンポーネントであり、各 JLabel の前に JCheckBox を追加することです。

問題は、JTree が表示された後にフォント サイズを大きくすると、ノード (下線付きのテキストを含む) のサイズが変更されないことです。これらのノードの HTML は、ノードが広くなるのを妨げているように見えるため、フォントが変更されると、テキストが切り捨てられます。

私のオプションは次のいずれかだと思います:1)JLabelからHTMLを削除すると、フォントサイズが変更されたときに適切にサイズ変更されるため、別のアプローチを使用してテキストに下線を付けるか、2)HTMLのフォーマットを維持して何らかの方法でJTree /フォントサイズが更新されたときにサイズを変更するJLabels(おそらくプロパティ変更イベントの発生による?)。

コードは、フォント サイズが更新されると、親 JFrame で SwingUtilities.updateComponentTreeUI() を既に呼び出しています。

編集: アプリケーションでフォントを変更するために使用される方法は、ここで説明されています

どんな助けでも大歓迎です。前もって感謝します!

-マイク

4

1 に答える 1

2

あなたが説明した問題を再現することはできません。これは、JavaSE 6 で動作するテスト プログラムです。

public class JTreeFontResize {
    private static JTree tree;
    private static JFrame frame;

    public static void main(String[] args) throws InterruptedException,
            InvocationTargetException {
        SwingUtilities.invokeAndWait(new Runnable() {
            @Override
            public void run() {
                tree = new JTree(new Object[] { "One (plain)",
                        "<html><u>Two (HTML)", "<html>Three (HTML)" });
                frame = new JFrame("Tree Font Resize");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setBounds(100, 100, 300, 300);
                frame.add(tree);
                frame.setVisible(true);
            }
        });

        Thread.sleep(2000);
        changeFontSize(20);

        Thread.sleep(2000);
        changeFontSize(30);

        Thread.sleep(2000);
        changeFontSize(12);
    }

    private static void changeFontSize(final int size) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Font font = new Font("Vernanda", Font.PLAIN, size);
                FontUIResource fontResource = new FontUIResource(font);
                Enumeration<Object> keys = UIManager.getDefaults().keys();
                while (keys.hasMoreElements()) {
                    Object key = keys.nextElement();
                    Object value = UIManager.get(key);
                    if (value instanceof FontUIResource) {
                        UIManager.put(key, fontResource);
                    }
                }
                SwingUtilities.updateComponentTreeUI(frame);
            }
        });
    }
}

上記がうまくいく場合は、問題のあるコードのカットダウン バージョンを投稿する必要があります。

于 2010-03-13T18:06:07.837 に答える