2

背景:

从文档中,该方法SwingUtilities.updateComponentTreeUI()要求树(什么树?)中的每个组件调用该方法来更新它们自己的UI 属性updateUI()强烈建议SwingUtilities.updateComponentTreeUI()在设置好LAF后调用,调用method: ,否则LAF主题无法应用到某些组件上,最糟糕的是,某些组件无法重新设计(可能会抛出一些异常?)。UIManager.setLookAndFeel(LAFClassName)

我对这种事情很陌生,我是在发现更具启发性的方法之后才发现SwingUtilities.updateComponentTreeUI() UIManager.setLookAndFeel(LAFClassName)

在发现之前SwingUtilities.updateComponentTreeUI()我一直有一些问题/Exceptions/NullPointerExceptions,而事实是直到我没有发现SwingUtilities.updateComponentTreeUI()方法之前我才真正理解它们的原因,这让我明白树中的某些组件不可能是更新到新的 LAF。

具体/实际问题:

例如,如果我有一个

子框架

(动态实例化或由动作事件(点击)触发

主框架

),在这里我设置了外观和感觉属性,然后我调用SwingUtilitiesupdateComponentTreeUI()传递给它的引用mainJFrame

SwingUtilities.updateComponentTreeUI(mainJFrame),

最后一个是否会更新其所有子组件/subJFrames(并因此更新subJFrame我设置 LAF 的位置)?

不是一个微不足道的问题(也请记住文档所说的内容),因为我UIManager.setLookAndFeel(LAFClassName)在中调用方法subJFrame(这个调用实际上是做什么的?)然后我调用SwingUtilities.updateComponentTreeUI()方法传递给它的引用mainJFrame,那么LAF 主题是什么将应用于mainJFrame?的所有子组件 如果一些子组件/subJFrames还没有被初始化呢

4

1 回答 1

4

updateComponentTreeUI如果您只在创建组件之前设置外观和感觉,则永远不需要调用。

如果您在创建组件后更改外观,那么您需要updateUI()在每个现有组件上调用该方法。这是有updateComponentTreeUI帮助的:它调用updateUI()组件,以及它包含的所有组件(以及它们包含的所有组件;这就是“树”的含义)。

如果我有一个subJFrame设置外观的位置,然后我调用SwingUtilities.updateComponentTreeUI()传递给它的引用mainJFrame:这是否会更新它的所有子组件/subJFrames(并因此更新我设置 LAF 的 subJFrame)?

如果subJFrame您的意思是一个直接包含在另一个 (a JInternalFrame) 中的窗口,那么是的。如果您的意思是一个仅从另一个框架打开的框架,但它是一个单独的顶级窗口,那么不,它不会更新它,因为它不包含在正在更新的组件中。

这是我在更改外观后用于更新所有顶级窗口的循环:

for (Window w : Window.getWindows()) {
    SwingUtilities.updateComponentTreeUI(w);
    if (w.isDisplayable() &&
        (w instanceof Frame ? !((Frame)w).isResizable() :
        w instanceof Dialog ? !((Dialog)w).isResizable() :
        true)) w.pack();
}

该循环不会捕获当前未附加到窗口的任何组件。例如,这可以包括JFileChoosers,如果您在变量未主动显示时将它们的实例保留在变量中,在这种情况下,您将需要在它们上单独调用 updateComponentTreeUI。

于 2014-07-25T16:37:07.477 回答