9

JFileChooser のウィンドウのルック アンド フィール レイアウトは、ニンバスのような他のルック アンド フィールよりもはるかに優れています。

だから私はシステムのレイアウトをルックアンドフィールにする方法を探していますが、ニンバスや他のテーマを一番上に持っています。

これは可能ですか?もしそうなら、どのようにそれを行うことができますか?

4

2 に答える 2

7

推奨されているかどうかはわかりませんが、可能です。最上位の JFileChooser コンポーネントを除くすべてのコンポーネントでビュー自体を更新するように要求することで、なんとか機能させることができました (これにより、すべてのチューザー コンポーネントが不要な Nimbus コンポーネントに置き換えられるため)。

これは、Windows のルック アンド フィールの内部構造に応じて機能する場合と機能しない場合があるハックと見なすことができます。これは、Swing コンポーネントによって構築された JFileChooser 全体にほぼ依存しています。より直接的なネイティブ レンダリングを使用するように変更された場合 (つまり、Java が Windows にセレクターの重要な部分をペイントするように要求する場合)、それは機能しません。そのトリックが他のコンポーネントでうまく機能するかどうかはわかりません。

とにかく、このコードはJDK 7で動作するように見えました:

package test;

import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel; //Or use com.sun.... if you are using JDK < 7

public class LAFTester
{
    public static void main(String... args)
    throws Exception
    {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFileChooser chooser = new JFileChooser();
        chooser.updateUI(); //Create UI objects
        UIManager.setLookAndFeel(NimbusLookAndFeel.class.getName()); //Now set look and feel
        //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); //works with metal as well
        refreshUI(chooser, false);

        chooser.showOpenDialog(null);
    }

    private static void refreshUI(JComponent c, boolean includeParent)
    {
        if (includeParent)
            c.updateUI();

        for (int i = 0; i < c.getComponentCount(); i++)
        {
            Component child = c.getComponent(i);
            if (child instanceof JComponent)
            {
                refreshUI((JComponent)child, true);
            }
        }
    }
}
于 2011-08-19T02:43:02.230 に答える
2

Windowsファイル選択ダイアログの左側にあるパネルについて話していると思いますがDesktopMy Computer My Documentsアイコンがありますか?

これは LAF 固有のものであるため、これが実行できるとは思えません。これは、Windows プラットフォーム ファイルが選択したように見えるため、Windows LAF に追加されました。他の LAF ではサポートされていません。

于 2011-08-19T02:43:42.187 に答える