【问题标题】:How to force an HTML JLabel in a JTree to resize when the font changes如何在字体更改时强制 JTree 中的 HTML JLabel 调整大小
【发布时间】:2010-03-14 02:06:07
【问题描述】:

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

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

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

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

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

任何帮助将不胜感激。提前致谢!

-迈克

【问题讨论】:

  • 这里最大的问题是:如何更改应用程序中的字体大小?如果不回答这个问题,我们将无法提供任何帮助。
  • 感谢您的评论。我已经编辑了这个问题,以包含一个指向以前的 SO 帖子的链接,该帖子解释了字体是如何更改的。

标签: java swing jtree


【解决方案1】:

我无法重现您描述的问题。这是一个适用于 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);
            }
        });
    }
}

如果上述方法对您有用,那么也许您应该发布有问题的代码的精简版本。

【讨论】:

  • 这是正确的答案。在基于上述的一些额外测试之后,问题出在用于为每个树节点添加复选框的自定义组件上。感谢您的帮助!
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多