48

Swingチュートリアルのエントリに基づいて、作成中の小さなデスクトップアプリに標準の[ファイルを開く]ダイアログを追加しました。次のようなウィンドウが生成されます。JFileChooser

不要な/XPスタイルのウィンドウのスクリーンショット

しかし、私は次のようなウィンドウが必要です。

希望する/7スタイルのウィンドウのスクリーンショット

つまり、ファイルチューザーにWindowsXPではなくWindowsVista /Windows7のスタイルを持たせたいのです。これはSwingで可能ですか?もしそうなら、それはどのように行われますか?(この質問の目的上、コードはWindows 7コンピューターでのみ実行されると想定します。)

4

10 に答える 10

20

これはJava6のSwingでサポートされているようには見えません。

現在、このダイアログを開くために私が見つけることができる最も簡単な方法は、SwingではなくSWTを使用することです。SWTのFileDialog(javadoc)はこのダイアログを表示します。以下は、保存ダイアログの代わりに開くダイアログを使用するようにSWTのFileDialogスニペットを変更したものです。これがあなたが探しているものではないことは知っていますが、これをユーティリティクラスに分離し、この機能のクラスパスにswt.jarを追加することができます。

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class SWTFileOpenSnippet {
    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell (display);
        // Don't show the shell.
        //shell.open ();  
        FileDialog dialog = new FileDialog (shell, SWT.OPEN | SWT.MULTI);
        String [] filterNames = new String [] {"All Files (*)"};
        String [] filterExtensions = new String [] {"*"};
        String filterPath = "c:\\";
        dialog.setFilterNames (filterNames);
        dialog.setFilterExtensions (filterExtensions);
        dialog.setFilterPath (filterPath);
        dialog.open();
        System.out.println ("Selected files: ");
        String[] selectedFileNames = dialog.getFileNames();
        for(String fileName : selectedFileNames) {
            System.out.println("  " + fileName);
        }
        shell.close();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }
} 
于 2011-05-28T05:22:12.530 に答える
10

ネイティブのWindowsアプリケーションでも、このタイプのダイアログをWindows 7に表示できます。これは通常、OPENFILENAME構造体のフラグと、WinAPI関数の呼び出しで渡されるサイズによって制御されますGetOpenFileName。Swing(Java)は、フックを使用して[ファイルを開く]ダイアログからイベントを取得します。これらのイベントは、WindowsXPとWindows7のバージョン間で異なる方法で渡されます。

したがって、答えは、SwingからFileChooserの外観を制御することはできないということです。ただし、Javaがこの新しい外観のサポートを取得すると、新しいスタイルが自動的に取得されます。

別のオプションは、この回答で提案されているように、SWTを使用することです。または、JNAを使用してWindows APIを呼び出すか、これを行うためのネイティブメソッドを作成することもできます。

于 2011-05-31T06:20:30.397 に答える
8

Java 8は最終的にこれに対する解決策をもたらすかもしれませんが、残念ながら(Swingアプリの場合)JavaFXクラスFileChooserとしてのみ提供されます。

私はここからこのコードをテストしました、そしてそれは確かに現代のダイアログをポップします(ここではWindows7):

FileChooser fileChooser = new FileChooser();

//Set extension filter
FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);

//Show open file dialog
File file = fileChooser.showOpenDialog(null);

Platform.runLaterこれをSwingアプリに統合するには、 (ここに表示されているように)を介してjavafxスレッドで実行する必要があります。

これには、javafxスレッドを初期化する必要があることに注意してください(この例では、これはのシーンの初期化で行われますnew JFXPanel())。

要約すると、swingアプリですぐに実行できるソリューションは次のようになります。

new JFXPanel(); // used for initializing javafx thread (ideally called once)
Platform.runLater(() -> {
    FileChooser fileChooser = new FileChooser();

    //Set extension filter
    FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
    FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
    fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);

    //Show open file dialog
    File file = fileChooser.showOpenDialog(null);
});
于 2014-08-22T07:28:52.583 に答える
7

ちょっとしたハックで、Swingバージョンよりも少し権限がありませんが、?の使用を検討しましたjava.awt.FileDialogか?Windowsのファイルチューザーのように見えるだけでなく、実際には1つである必要があります。

于 2011-04-18T14:01:28.307 に答える
7

Swingがそれをカバーするとは思わないが、そうでない場合は、実際のネイティブコンポーネントを利用するSWTのようなものを調べたり、カスタムUI要素を実行したりする必要があるかもしれない。 「FilthyRichClients」の本。

于 2011-04-18T15:28:58.937 に答える
2

良い質問+1、Win7(defaultLookAndFeel)用の何かをJava6に実装するのを「忘れた」ように見えますが、WinXPの場合は正しく機能します。また、そのためのメソッド/プロパティが存在する必要があることを願っています。

とにかく、このコードでそれを試すことができます、

import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;

class ChooserFilterTest {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                String[] properties = {"os.name", "java.version", "java.vm.version", "java.vendor"};
                for (String property : properties) {
                    System.out.println(property + ": " + System.getProperty(property));
                }
                JFileChooser jfc = new JFileChooser();
                jfc.showOpenDialog(null);
                jfc.addChoosableFileFilter(new FileFilter() {

                    @Override
                    public boolean accept(File f) {
                        return f.isDirectory() || f.getName().toLowerCase().endsWith(".obj");
                    }

                    @Override
                    public String getDescription() {
                        return "Wavefront OBJ (*.obj)";
                    }

                    @Override
                    public String toString() {
                        return getDescription();
                    }
                });
                int result = JOptionPane.showConfirmDialog(null, "Description was 'All Files'?");
                System.out.println("Displayed description (Metal): " + (result == JOptionPane.YES_OPTION));
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    SwingUtilities.updateComponentTreeUI(jfc);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                jfc.showOpenDialog(null);
                result = JOptionPane.showConfirmDialog(null, "Description was 'All Files'?");
                System.out.println("Displayed description (System): " + (result == JOptionPane.YES_OPTION));
            }
        };
        SwingUtilities.invokeLater(r);
    }

    private ChooserFilterTest() {
    }
}
于 2011-05-25T11:21:11.603 に答える
1

しかし、これをディレクトリで機能させることはできませんでした!! DirectoryDialogは、質問にリストされているものと同じツリースタイルのディレクトリチューザーに戻ります。問題は、非表示のフォルダを選択/選択/開くことができないことです。また、AppData、ProgramDataなどのフォルダーへのナビゲーションもできません。

Windows 7スタイルのファイルダイアログ(swt)は、これらのフォルダーへのナビゲーションを許可しますが、フォルダーの選択は許可しません:(

更新 非表示のフォルダーを表示するには、JFileChooserを使用しますsetFileHidingEnabled(false)。これに関する唯一の義務は、ユーザーが「隠しファイル、フォルダ、およびドライブを表示する」を選択する必要があることです。

フォルダオプション->表示

Windowsエクスプローラの

アドレスバーの柔軟性は得られませんが、Javaでツリーのようなものではないファイルチューザーを探していた場合は、隠しファイル/フォルダーを参照/表示することもできます-これで十分です

于 2013-06-08T06:58:14.817 に答える
1

ジョン・マッカーシーの答えは最高のようです。ここにいくつかの提案があります。

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.Image;

左上隅に画像を追加します。「getResourceAsStream」を使用することが重要です。Runnablejarとしてエクスポートした後に気付くでしょう。

Display display = new Display();
Shell shell = new Shell(display);
InputStream inputImage = getClass().getResourceAsStream("/app/launcher.png");
if (inputImage != null) {
    shell.setImage(new Image(display, inputImage));
}

ユーザーのホームディレクトリ:

String filterPath = System.getProperty("user.home");

他のドライブでは間違っている、フィルターに依存するパス名の代わりに絶対パス名を取得します。

String absolutePath = dialog.open();
于 2015-07-28T12:15:47.847 に答える
0

JFileChooserは、Swingの見た目が少し変わっていて、少し遅いです。

SWTのfilechooserを使用してみてください。そうしないと、C呼び出しをJNAでラップできます。

于 2011-05-24T21:46:59.530 に答える
0

SwingはさまざまなL&Fをエミュレートするため、JREを最新のものにアップグレードし、JFileChooserUIが更新されていることを期待するのが最善の策だと思います。

于 2011-04-18T14:58:26.063 に答える