2012-03-16 134 views
0

我正在使用JFileChoosershowSaveDialoge()setSelectionMode(JfileChooser.DIRECTORIES_ONLY)來設置保存預選文件的位置以及它將被調用的位置。使用JFileChooser保存

我希望用戶能夠選擇新版本的名稱以及放置位置。我如何去做這件事?我也希望選擇一個默認名稱。

+1

請考慮將你的問題分解成句子。 – 2012-03-16 02:13:22

+1

從一點點我能理解你的問題,也許這將幫助http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html#fileview – 2012-03-16 03:19:45

+1

如果它是一個期限,我懷疑這是功課?如果是這樣,你可能想要標記它。 – Jochen 2012-03-23 16:10:38

回答

12

我希望下面與您的問題,要求在線實現的代碼。代碼評論中回答了您問題中的條件。如果您需要澄清,請告訴我。

import java.awt.BorderLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

public class MyFileChooser extends JPanel implements ActionListener 
{ 
    JButton saveButton; 
    JTextArea content; 
    JFileChooser jfc; 

    private boolean docUpdate = false; 
    private String default_filename = "default.txt"; 
    private String default_directory = "/home/foo/workspace"; 
    private int version = 0; 

    public MyFileChooser() 
    { 
     super(new BorderLayout()); 

     content = new JTextArea(5, 20); 
     content.setMargin(new Insets(5, 5, 5, 5)); 
     content.getDocument().addDocumentListener(new DocumentListener() 
     { 

      @Override 
      public void removeUpdate(DocumentEvent e) 
      { 
       System.out.println("remove update"); 
       docUpdate = true;    
      } 

      @Override 
      public void insertUpdate(DocumentEvent e) 
      { 
       System.out.println("insert update"); 
       docUpdate = true; 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) 
      { 
       System.out.println("changed update"); 
       docUpdate = true;    
      } 
     }); 
     JScrollPane logScrollPane = new JScrollPane(content); 

     jfc = new JFileChooser(); 

     /** 
     * Set a initial default directory and a initial default filename here. 
     */ 
     //fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
     jfc.setCurrentDirectory(new File(default_directory)); 
     jfc.setSelectedFile(new File(default_filename)); 
     jfc.addPropertyChangeListener(new PropertyChangeListener() { 

      @Override 
      public void propertyChange(PropertyChangeEvent evt) 
      {    
       if (docUpdate == true) 
       { 
        /** 
        * User can use the suggested filename or remove the suggested, 
        * and enter a new filename. 
        * Here, we set to a new directory and of cause, user can select 
        * what is the directory he want. 
        */ 
        jfc.setCurrentDirectory(new File("/home/foo")); 
        jfc.setSelectedFile(new File("default" + version + ".txt")); 
       }    
      } 
     }); 

     saveButton = new JButton("Save a File..."); 
     saveButton.addActionListener(this); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(saveButton); 

     add(buttonPanel, BorderLayout.PAGE_START); 
     add(logScrollPane, BorderLayout.CENTER);   
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 

     int returnVal = jfc.showSaveDialog(MyFileChooser.this); 
     if (returnVal == JFileChooser.APPROVE_OPTION) 
     { 
      File file = jfc.getSelectedFile(); 
      // save the file. 
      BufferedWriter bw; 
      try { 
       bw = new BufferedWriter(new FileWriter(file)); 
       bw.write(content.getText()); 
       bw.flush(); 
      }    
      catch (IOException e1) 
      { 
       e1.printStackTrace(); 
      } 
      version++; 

     } 
     else 
     { 
      System.out.println("Save command cancelled by user. "); 
     } 
     content.setCaretPosition(content.getDocument().getLength()); 

    } 

    private static void createAndShowGUI() 
    {  
     JFrame frame = new JFrame("FileChooserDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.add(new MyFileChooser()); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

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

      @Override 
      public void run() 
      { 
       createAndShowGUI();    
      } 
     }); 
    } 

} 
+4

真的嗎?即使寫代碼得到downvote? – Jasonw 2012-03-25 16:52:35

1

是的,這可以做到。顯然你需要使用屬性更改偵聽器來設置每個目錄更改後的默認文件名。您還需要確保您使用的showSaveDialog()和關閉目錄的唯一選擇模式(你希望他們挑一個文件名的特定路徑)

這裏是關於的屬性更改偵聽器部分的一些代碼:

// create a new FileChooser 
chooser = new JFileChooser(); 

String defaultFileName = "del.txt" 

// add listener to filter changes 
chooser.addPropertyChangeListener(JFileChooser.DIRECTORY_CHANGED_PROPERTY, 
new PropertyChangeListener() { 
    public void propertyChange(PropertyChangeEvent evt) { 

     chooser.setSelectedFile(
      new File(chooser.getCurrentDirectory().getAbsolutePath() + 
       "\\" + defaultFileName)); 


     chooser.updateUI(); 

    } 
}); 

這段代碼是從這裏的例子:http://www.codeguru.com/forum/archive/index.php/t-38894.html

+0

-1 for updateUI(不適用於應用程序代碼) – kleopatra 2012-03-19 10:54:47

1

擴展的對話框,並添加您需要的組件,如用於版(JComboBox中)的條目,默認的文件名域(JTextField中),您設置默認名稱和按確定,取選定的所有組件值,然後保存你的需求。