Как заставить HTML JLabel в JTree изменять размер при изменении шрифта - PullRequest
1 голос
/ 12 марта 2010

Я обновляю приложение Java Swing, чтобы поддерживать переключение шрифта приложения с обычного размера на больший (чтобы пользователь мог переключаться между двумя размерами во время выполнения). Одна проблема, с которой я столкнулся, связана с JTree, который использует HTML для узлов дерева, чтобы подчеркнуть текст в некоторых узлах (HTML просто встроен в JLabel каждого узла дерева). Еще одна вещь, которую нужно знать об узлах, это то, что они являются пользовательским компонентом, добавляя JCheckBox перед каждым JLabel.

Проблема в том, что когда JTree становится видимым, увеличение размера шрифта приводит к тому, что узлы (содержащие подчеркнутый текст) не изменяют размер. HTML для этих узлов, кажется, препятствует расширению узла, поэтому при изменении шрифта текст становится усеченным.

Я думаю, что у меня есть варианты: 1) использовать другой подход для подчеркивания текста, так как удаление HTML из JLabel приводит к его правильному изменению размера при изменении размера шрифта, или 2) сохранение форматирования HTML и как-то принудительно JTree / JLabels для изменения размера при обновлении размера шрифта (возможно, с помощью события изменения свойства?).

Код уже вызывает SwingUtilities.updateComponentTreeUI () в родительском JFrame, когда размер шрифта обновляется.

РЕДАКТИРОВАТЬ: метод, используемый для изменения шрифта в приложении, объясняется здесь .

Любая помощь будет принята с благодарностью. Заранее спасибо!

-Mike

1 Ответ

2 голосов
/ 13 марта 2010

Я не могу воссоздать проблему, которую вы описываете. Вот тестовая программа, которая работает для меня на 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);
            }
        });
    }
}

Если вышеприведенное работает для вас, возможно, вам следует опубликовать урезанную версию вашего проблемного кода.

...