8

JFileChooser の Windows ルック アンド フィールでは、JFileChooser ダイアログの左側に、最近使用した項目、デスクトップ、マイ ドキュメント、コンピュータ、およびネットワークの 5 つのボタンが表示されます。これらはそれぞれ、Windows エクスプローラーで表示されるファイル システムのビューを表します。setSelectedFile() または setCurrentDirectory() メソッドが呼び出されない限り、JFileChooser はデフォルトで My Documents ビューに設定されているようです。

「コンピューター」ビューに表示される、多数のマップされたネットワーク ドライブの 1 つをユーザーが簡単に選択できるようにしようとしています。デフォルトで「コンピュータ」ビューを開くように JFileChooser を設定する方法はありますか?

私はそれを強制するためにいくつかの方法を試しました.最新のものはルートディレクトリを見つけてcurrentDirectoryとして設定することですが、これはそのルートノードの内容を示しています. 最新のコードは以下に含まれています。

private File originalServerRoot;
private class SelectOriginalUnitServerDriveListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            JFileChooser origDriveChooser = new JFileChooser();
            origDriveChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            File startFile = new File(System.getProperty("user.dir")); //Get the current directory

            // Find System Root
            while (!FileSystemView.getFileSystemView().isFileSystemRoot(startFile))
            {
                startFile = startFile.getParentFile();
            }

            origDriveChooser.setCurrentDirectory(startFile);
            origDriveChooser.setDialogTitle("Select the Mapped Network Drive");
            int origDriveChooserRetVal = origDriveChooser.showDialog(contentPane,"Open");
            if (origDriveChooserRetVal == JFileChooser.APPROVE_OPTION)
            {
                originalUnitServerRoot = origDriveChooser.getSelectedFile();

            }
        }
    }

デフォルトで「コンピューター」ビュー (またはネットワーク、またはその他のビュー) を選択できるようにする方法、または JFileChooser をだます方法はありますか?

編集
迅速かつ完全な回答をありがとう。Hovercraft Full Of Eels と Guillaume Polet の回答を組み合わせて、どのドライブ文字でもコードが機能するようにしました。結果のコードは次のとおりです。もう一度、ありがとう。

private File originalServerRoot;
private class SelectOriginalUnitServerDriveListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            JFileChooser origDriveChooser = new JFileChooser();
            origDriveChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            File startFile = new File(System.getProperty("user.dir")); //Get the current directory

            // Find System Root
            while (!FileSystemView.getFileSystemView().isFileSystemRoot(startFile))
            {
                startFile = startFile.getParentFile();
            }
            //Changed the next line
            origDriveChooser.setCurrentDirectory(origDriveChooser.getFileSystemView().getParentDirectory(rootFile));
            origDriveChooser.setDialogTitle("Select the Mapped Network Drive");
            int origDriveChooserRetVal = origDriveChooser.showDialog(contentPane,"Open");
            if (origDriveChooserRetVal == JFileChooser.APPROVE_OPTION)
            {
                originalUnitServerRoot = origDriveChooser.getSelectedFile();

            }
        }
    }
4

3 に答える 3

7

これが実際の例です。C:\ が有効なパスであると仮定します。それはFileSystemView.getParentDir(File)

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().initUI();
            }
        });
    }

    protected void initUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        final JButton button = new JButton("Select files...");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                final JFileChooser chooser = new JFileChooser();
                chooser.setCurrentDirectory(
                                 chooser.getFileSystemView().getParentDirectory(
                                     new File("C:\\")));  
                            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                chooser.showDialog(button, "Select file");
            }
        });
        panel.add(button);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
于 2012-05-09T22:01:22.733 に答える
4

toString()これを行うための手ごわい方法は、取得したファイルのが「コンピュータ」になるまで、デフォルトのディレクトリの親を取得することです。何かのようなもの:

  FileSystemView fsv = FileSystemView.getFileSystemView();
  File defaultFile = fsv.getDefaultDirectory();
  while (defaultFile != null) {
     defaultFile = defaultFile.getParentFile();
     if (defaultFile != null && "Computer".equalsIgnoreCase(defaultFile.toString())) {
        JFileChooser fileChooser = new JFileChooser(defaultFile);
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int result = fileChooser.showOpenDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
           File file = fileChooser.getSelectedFile();
           System.out.println(file);
        }
     }
  }
于 2012-05-09T21:57:06.173 に答える