1

私はJavaが初めてなので、ご容赦ください。

私のプログラムでは、ユーザーが選択したディレクトリにファイルを保存できるようにしたいと考えています。少し調べてみたところ、JFileChooser という気の利いたクラスを見つけました。私がやりたいことは、ユーザーが JFileChooser GUI を介して目的のディレクトリに移動し、ファイルの名前を入力して、ファイルを目的のディレクトリに保存できるようにすることです。これを行う方法の解決策をオンラインで探してみましたが、読んだほとんどすべての場所で、最終的な答えは「プログラムにファイルを保存させる必要があります」でした。誰かが上記の説明を行う、よくコメントされたダミーコードを提供できますか? また、JFileChooser が「新しいフォルダ」オプションを提供しているかどうかを知っている人はいますか?

前もって感謝します。

4

1 に答える 1

4

すべてのピースを組み合わせるのは簡単なことではありません。特定の拡張子に保存するには、FileFilter が必要です。

これは、私の Swing アプリケーションの 1 つからの例です。

protected static final String EXTENSION = ".png";

protected static final String FORMAT_NAME = "png";

protected static final LayoutFileFilter SAVE_AS_IMAGE = 
        new LayoutFileFilter("PNG Image Format", EXTENSION, true);

protected int chooseSaveFile(BufferedImage image) {
    JFileChooser fileChooser = new JFileChooser();
    ExtensionFileFilter pFilter = new ExtensionFileFilter(SAVE_AS_IMAGE);
    fileChooser.setFileFilter(pFilter);
    int status = fileChooser.showSaveDialog(frame.getFrame());

    if (status == JFileChooser.APPROVE_OPTION) {
        File selectedFile = fileChooser.getSelectedFile();

        try {
            String fileName = selectedFile.getCanonicalPath();
            if (!fileName.endsWith(EXTENSION)) {
                selectedFile = new File(fileName + EXTENSION);
            }
            ImageIO.write(image, FORMAT_NAME, selectedFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return status;
}

EXTENSION が既に存在しない限り、ファイル名の末尾に EXTENSION が追加されるようにするコードがメソッドに含まれていることに気付くでしょう。これは、同等の Java には欠けている Windows の標準的な動作です。

特定の拡張子を保存するには、FileFilter が必要です。

import java.io.File;

import javax.swing.filechooser.FileFilter;

public class ExtensionFileFilter extends FileFilter {

    protected LayoutFileFilter filter;

    protected String description;
    protected String[] extensions;

    public ExtensionFileFilter(LayoutFileFilter filter) {
        this(filter.getDescription(), filter.getExtension());
        this.filter = filter;
    }

    public ExtensionFileFilter(String description, String extension) {
        this(description, new String[] {extension});
    }

    public ExtensionFileFilter(String description, String[] extensions) {
        if ((description == null) || (description.equals(""))) {
            this.description = extensions[0] + " {" + extensions.length + "}";
        } else {
            this.description = description;
        }
        this.extensions = (String[]) extensions.clone();
        toLower(this.extensions);
    }

    private void toLower(String[] extensions) {
        for (int i = 0, n = extensions.length; i < n; i++) {
            extensions[i].toLowerCase();
        }
    }

    @Override
    public boolean accept(File file) {
        if (file.isDirectory()) {
            return true;
        } else {
            String path = file.getAbsolutePath().toLowerCase();
            for (int i = 0, n = extensions.length; i < n; i++) {
                String extension = extensions[i];
                if (path.endsWith(extension)) {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public String getDescription() {
        return description;
    }

    public LayoutFileFilter getLayoutFileFilter() {
        return filter;
    }

}

最後に、LayoutFileFilter です。

public class LayoutFileFilter {

    boolean isDefault;

    String description;
    String extension;

    public LayoutFileFilter() {

    }

    public LayoutFileFilter(String description, String extension,
            boolean isDefault) {
        this.description = description;
        this.extension = extension;
        this.isDefault = isDefault;
    }

    public boolean isDefault() {
        return isDefault;
    }

    public void setDefault(boolean isDefault) {
        this.isDefault = isDefault;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getExtension() {
        return extension;
    }

    public void setExtension(String extension) {
        this.extension = extension;
    }

}
于 2012-12-21T20:41:50.567 に答える