1

我正在更新 Java Swing 应用程序以支持用户将应用程序的字体从正常大小切换到更大的大小(因此用户可以在运行时在两种大小之间切换)。我遇到的一个问题是 JTree 使用 HTML 作为树节点来为某些节点中的文本加下划线(HTML 只是嵌入在每个树节点的 JLabel 中)。关于节点的另一件事是它们是一个自定义组件,在每个 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 回答