web-dev-qa-db-ja.com

JFileChooserでデフォルトの保存拡張機能を設定する

JFileChooserを使用してファイルを保存しようとしています。しかし、私はそれでいくつかの問題を抱えているようです。これが私のコードです:

    if (e.getSource() == saveMenu) {

        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        FileNameExtensionFilter xmlFilter = new FileNameExtensionFilter("xml files (*.xml)", "xml");
        // add filters
        chooser.addChoosableFileFilter(xmlFilter);
        chooser.setFileFilter(xmlFilter);

        int result = chooser.showSaveDialog(Simulation.this);

        if (result == chooser.APPROVE_OPTION) {
            writeToXML(chooser.getSelectedFile());
        }

    }

これはファイルに.xml拡張子を付けることを強制しないので、次のコードを使用してファイルを拡張子.xmlで保存するように試みました

     OutputFormat format = OutputFormat.createPrettyPrint();
     format.setEncoding("UTF-8");
     XMLWriter xmlWriter = null;
     try {              
         xmlWriter = new XMLWriter(new OutputStreamWriter(
                 new FileOutputStream(f+".xml"), "UTF8"),
                 format);

ただし、これにより、ユーザーがJFileChooserxpto.xmlを書き込むのを防ぐことはできません。そうすると、ファイルには「2つの拡張子」が付けられます。これは、xpto.xml.xmlという名前のファイルになります

だから私の質問は:

  • デフォルトでJFileChooserにxmlファイルを保存させるにはどうすればよいですか?
  • ユーザーがxpto.xmlのようなファイル名を挿入した場合、どうすればxpto.xml.xmlではなくxpto.xmlとして保存できますか?
15
SaintLike

お気づきのとおり、JFileChooserは保存時にFileFilterを強制しません。表示されるダイアログで既存の非XMLファイルをグレー表示しますが、それだけです。ファイル名を強制するには、すべての作業を行う必要があります。 (これはJFileChooserの問題だけではありません-処理するのは複雑な問題です。ユーザーがファイルに名前を付けることができるようにしたいxml.xml.xml.xml。)

あなたの場合、Commons IOの FilenameUtils を使用することをお勧めします。

File file = chooser.getSelectedFile();
if (FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("xml")) {
    // filename is OK as-is
} else {
    file = new File(file.toString() + ".xml");  // append .xml if "foo.jpg.xml" is OK
    file = new File(file.getParentFile(), FilenameUtils.getBaseName(file.getName())+".xml"); // ALTERNATIVELY: remove the extension (if any) and replace it with ".xml"
}

ここに保存ダイアログで複数のタイプが必要な場合の対処方法についてのアイデアもあります。 JFileChooserを使用してファイルを保存する方法

19

JFileChooserを使用してファイルを保存する方法を明確にするためです。

//set it to be a save dialog
 chooser.setDialogType(JFileChooser.SAVE_DIALOG);
//set a default filename (this is where you default extension first comes in)
 chooser.setSelectedFile(new File("myfile.xml"));
//Set an extension filter, so the user sees other XML files
 chooser.setFileFilter(new FileNameExtensionFilter("xml file","xml"));

この例では、ユーザーにアイテムをxmlファイルとして保存することを推奨しましたが、実際に設定していない可能性があります。

if(chooser.showSaveDialog(this) == jFileChooser.APPROVE_OPTION)
{
   String filename = chooser.getSelectedFile().toString();
   if (!filename .endsWith(".xml"))
        filename += ".xml";

   //DO something with filename

 }

これは最も単純なケースです。可能なファイル形式が複数ある場合は、選択したフィルターをキャッチし、その拡張子を確認し、選択した形式に従ってファイルを保存する必要があります。しかし、あなたがそうしているなら、あなたはおそらく上級のJava=プログラマーであり、この投稿を利用していません。

11
DiamondDrake

このようなものはどうですか:

    else if (e.getSource() == saveMenu) {
        int returnVal = chooser.showSaveDialog(Simulator.this);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = chooser.getSelectedFile();

            String fname = file.getAbsolutePath();

            if(!fname.endsWith(".xml") ) {
                file = new File(fname + ".xml");

            if(!file.createNewFile()) {
                /*check with user??*/
            }
3
7stud

これを試してみてください。私はこれを行い、それはうまくいきました。

FileOutputStream fileOut =  new FileOutputStream(file1+".xml");
hwb.write(fileOut);
fileOut.close();
System.out.println("\n Your file has been generated!");
JOptionPane.showMessageDialog(this,"File Created.");
0
Aparna Pathak

あなたはこれを試す必要があります:

if(!file.getName().contains(".")) file = new File(file.toString() + ".xml");
0
user8642840