2

バックグラウンド:

ドキュメントから、メソッドSwingUtilities.updateComponentTreeUI()はツリー内の各コンポーネント (What tree?) にメソッドを呼び出して独自のUI プロパティを更新するように依頼します。 メソッドを呼び出して LAF を設定した後に呼び出すことを強くお勧めします:updateUI()SwingUtilities.updateComponentTreeUI()UIManager.setLookAndFeel(LAFClassName)

私はこの種のことは初めてで、より示唆に富む方法を発見した後にその方法を発見ましSwingUtilities.updateComponentTreeUI() UIManager.setLookAndFeel(LAFClassName)

発見する前SwingUtilities.updateComponentTreeUI()に、私はいくつかの問題/Exceptions/NullPointerExceptionsSwingUtilities.updateComponentTreeUI()を抱えていました。真実は、メソッドを発見するまで、それらの理由を本当に理解していなかったということです。新しいLAFに更新されました。

具体的/実際の問題:

たとえば、私が持っている場合

subJFrame

(動的にインスタンス化されるか、

mainJFrame

) で、ルック アンド フィールのプロパティ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、そのすべてのサブコンポーネント/subJFrameが更新されます(したがって、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();
}

そのループは、現在ウィンドウに接続されていないコンポーネントをキャッチしません。たとえば、JFileChooserアクティブに表示されていないときにそれらのインスタンスを変数に保持する場合、これには s を含めることができます。その場合、それらに対して updateComponentTreeUI を個別に呼び出す必要があります。

于 2014-07-25T16:37:07.477 に答える