如何强制JTree中的HTML JLabel在字体更改时调整大小

时间:2010-03-12 03:12:00

标签: java swing jtree

我正在更新Java Swing应用程序以支持用户将应用程序的字体从正常大小切换到更大的大小(因此用户可以在运行时在两种大小之间切换)。我遇到的一个问题是使用一个JTree,它使用HTML树节点来强调某些节点中的文本(HTML只是嵌入在每个树节点的JLabel中)。关于节点的一个额外的事情是它们是一个自定义组件,在每个JLabel前面添加一个JCheckBox。

问题是,一旦JTree可见,增加字体大小会导致节点(包含带下划线的文本)不会调整大小。这些节点的HTML似乎阻止节点变宽,因此当字体更改时,文本会被截断。

我认为我的选择是:1)使用另一种方法使文本加下划线,因为从JLabel中删除HTML会导致它在字体大小更改时正确调整大小,或者2)保持HTML格式并以某种方式强制JTree / JLabels在更新字体大小时调整大小(可能通过触发属性更改事件?)。

当字体大小更新时,代码已在父JFrame上调用SwingUtilities.updateComponentTreeUI()。

编辑:用于更改应用程序中字体的方法是explained here

非常感谢任何帮助。提前谢谢!

-Mike

1 个答案:

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

如果上述内容适用于您,那么您可能会发布有问题代码的缩减版本。