JFileChooser: inserire in nome file l'estensione del filtro

Sevenjeak

Utente Attivo
27 Nov 2012
81
2
8
36
sevenjeak.altervista.org
Non so se dal titolo si capisce quello che vorrei ottenere, in ogni caso ve lo spiego ora.

In un mio progetto di prova, sempre per un'altro mio progetto, vorrei poter realizzare un JFileChooser, che prende di default in nome del file cosi formato: nuovo + estensione filtro selezionato di default, ora io, vorrei che questo nome lo modificasse ogni volta, e lo cambiasse, con lo stesso nome con la rimozione dell'estensione, sostituita dall'estensione nuova ( quella appena selezionata dall'utente ). non so se fin qui sono stato chiaro, ma cercando di risolvere il mio problema cercando la soluzione su internet sono venuto a scrivere questo codice:

Codice:
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;

public class prChooser
{
	public static void main(String[] args) 
	{
		JFrame frm = new JFrame();
	    JPanel mP = new JPanel(new GridLayout(2, 1));
		JTextPane tP = new JTextPane();
		JButton bS = new JButton(" Salva documento ");
		
		frm.setSize(200, 200);
		bS.addActionListener(new EM());
		
		mP.add(bS);
		mP.add(tP);
		
		frm.add(mP);
		frm.setVisible(true);
		
		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	private static class EM implements ActionListener
	{
		public void actionPerformed(ActionEvent ae)
		{
			String cmd = ae.getActionCommand();
			
			if (cmd.equals(" Salva documento ")) {
				JFileChooser chooser = new JFileChooser();
	   			   
	   			chooser.removeChoosableFileFilter(chooser.getFileFilter());
	   			chooser.addChoosableFileFilter(new FileNameExtensionFilter("Documento HTML ( *.html )", "html"));
	   			chooser.addChoosableFileFilter(new FileNameExtensionFilter("Script PHP ( *.php )", "php"));
	   			chooser.addChoosableFileFilter(new FileNameExtensionFilter("Script ASP ( *.asp )", "asp"));
	   			chooser.addChoosableFileFilter(new FileNameExtensionFilter("Script JavaScript ( *.js )", "js"));
	   			chooser.addChoosableFileFilter(new FileNameExtensionFilter("Documento XML ( *.xml )", "xml"));
	   		    chooser.addChoosableFileFilter(new FileNameExtensionFilter("Documento di testo ( *.txt )", "txt"));
	   		    
	   		    FileNameExtensionFilter extensionFile = (FileNameExtensionFilter) chooser.getFileFilter();
	   		    chooser.setSelectedFile(new File("nuovo." + extensionFile.getExtensions()[0]));
	   		    
	   		    chooser.addPropertyChangeListener(new PropertyChangeListener() {
				   public void propertyChange(PropertyChangeEvent pcEvt) 
				   {
					  JFileChooser ch = (JFileChooser) pcEvt.getSource();
				      Object objCh = pcEvt.getNewValue();
				      
				      if (objCh instanceof FileNameExtensionFilter) {
				    	  FileNameExtensionFilter newFilter = (FileNameExtensionFilter) objCh;
				    	  
				    	  String newExtension = newFilter.getExtensions()[0];
                          File selectedFile = ch.getSelectedFile();
                          String nameFile = selectedFile.toString().substring(0, selectedFile.toString().lastIndexOf("."));
				      }
				  }
			   });
	   		    
	   		   if ((int)chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
				  // operazione per il salvataggio del file
			   }
			}
		}
	}
}

Ovviamente non è completo, anche perché mi sono accordo, come potete anche vedere voi, che la variabile selectedFile ti tipo File all'interno del metodo addPropertyChangeListener(), del JFileChooser ( per intercettare il cambio, da parte dell'utente, delle sue proprietà ) mi ritorna un valore nullo, uguale a null, ecco, questo è il mio unico problema, non capisco come mai mi ritorna un valore nullo e come risolvere il problema.
 
Ciao,

probabilmente perchè vuoi il file selezionato, prima che lo stesso è selezionato....

Mi spiego meglio, il file viene selezionato quando clicchi sull'approve_option o la save_option, non quando scrivi o selezione il nome dalla gui

ciao
 
In poche parole stai dicendo che il getSelectedFile() prende il nome solamente quando hai premuto sul tasto ok?

Forse è vero.. cmq, ho appena notato che: provando a modificare l'evento in questo modo:

Codice:
chooser.addPropertyChangeListener(new PropertyChangeListener() {
				   public void propertyChange(PropertyChangeEvent pcEvt) 
				   {
					  JFileChooser ch = (JFileChooser) pcEvt.getSource();
				      
				          System.out.println(ch.getSelectedFile());
				  }
			   });

ch.getSelectedFile() mi restituisce il nome del file, quando apro la finestra per salvarlo, ma ogni volta che cambio qualche proprietà ad esso mi restituisce null, anche se ogni volta le operazione nell'evento mi si ripetono tre volte, motivo per qui avevo racchiuso le operazioni dentro una if.

Prima di postare il mio precedente codice avevo anche provato a impostare il JFileChooser utilizzando il modificatore final, cosi da renderlo disponibile anche dentro l'evento, a questo punto, non saprei, come potrei risolvere questo problema?
 
Ciao, io non ho capito cosa vuoi fare esattamente....

Una volta impostati i filtri sul nome del file, a che ti serve ogni volta recuperare l'estenzione?

Mi spiego meglio il comportamento voluto, magari con qualche esempio?

grazie
 
Ti spiego meglio:

Te conosci l'editor Notepad++?

In quell'editor quando decidi di salvare un nuovo documento vai su File > Salva con nome, di default il nome e uguale al nome del file, ma se cambi il filtro cambia il nome del file in: nome file + estensione filtro, io vorrei ottenere quell'effetto, non so se sono stato chiaro, in poche parole l'estensione la dovrei accodare al nome del file.
 
Ciao,

praticamente il problema sta nel fatto che quando cambi il file filter il selected file viene messo a null perchè non matcha.

Es nuovo.html, se passo al filtro .php viene settato null e quindi tu hai il null pointer.

Ho fatto un piccolo esempio che ovvia al problema, non so se è proprio quello che ti serviva, fammi sapere. ciao

Codice:
	public static void main(String[] args) {

		JFileChooser chooser = new JFileChooser();

		chooser.removeChoosableFileFilter(chooser.getFileFilter());
		FileNameExtensionFilter htmlFilter = new FileNameExtensionFilter("Documento HTML ( *.html )", "html");
		chooser.addChoosableFileFilter(htmlFilter);
		chooser.addChoosableFileFilter(new FileNameExtensionFilter("Script PHP ( *.php )", "php"));
		chooser.addChoosableFileFilter(new FileNameExtensionFilter("Script ASP ( *.asp )", "asp"));
		chooser.addChoosableFileFilter(new FileNameExtensionFilter("Script JavaScript ( *.js )", "js"));
		chooser.addChoosableFileFilter(new FileNameExtensionFilter("Documento XML ( *.xml )", "xml"));
		chooser.addChoosableFileFilter(new FileNameExtensionFilter("Documento di testo ( *.txt )", "txt"));

		chooser.setSelectedFile(new File("nuovo.html"));
		chooser.setFileFilter(htmlFilter);

		chooser.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY, new PropertyChangeListener() {

			@Override
			public void propertyChange(PropertyChangeEvent pcEvt) {
				JFileChooser ch = (JFileChooser) pcEvt.getSource();

				FileNameExtensionFilter fileNameExtensionFilter = (FileNameExtensionFilter) pcEvt.getNewValue();
				ch.setSelectedFile(new File("nuovo." + fileNameExtensionFilter.getExtensions()[0]));

				System.out.println("FILE_FILTER_CHANGED_PROPERTY - " + ch.getSelectedFile());
			}
		});

		if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
			File selectedFile = chooser.getSelectedFile();
			String absolutePath = selectedFile.getAbsolutePath();
			FileNameExtensionFilter fileNameExtensionFilter = (FileNameExtensionFilter) chooser.getFileFilter();
			String selectedExtension = fileNameExtensionFilter.getExtensions()[0];

			if (absolutePath.contains(".")) {
				selectedFile = new File(absolutePath.substring(0, absolutePath.indexOf(".") + 1) + selectedExtension);
			} else {
				selectedFile = new File(absolutePath + "." + selectedExtension);
			}
			System.out.println(selectedFile);
		}

	}
 

Discussioni simili