JFileChooser: inserire in nome file l'estensione del filtro

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
33
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.
 

Slyfer

Utente Attivo
4 Dic 2010
65
21
0
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
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
33
sevenjeak.altervista.org
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?
 

Slyfer

Utente Attivo
4 Dic 2010
65
21
0
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
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
33
sevenjeak.altervista.org
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.
 

Slyfer

Utente Attivo
4 Dic 2010
65
21
0
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
Autore Titolo Forum Risposte Data
Couting95 inserire dati da un file di testo in una tabella in php PHP 0
D Inserire link PHP 0
L PHPSpreadsheet inserire dati da file .xlsx/.xls su database PHP 2
P inserire due voci in un titolo post wp WordPress 1
R inserire video nel sito HTML e CSS 15
J Inserire blog wordpress in angular CMS (Content Management System) 1
A inserire variabile php colore in div html PHP 2
L inserire dati multi livello PHP 8
G Inserire una scritta Java 1
M Inserire variabile nella value di una hidden PHP 3
S Inserire foto in ogni cella di una tabella Javascript 0
G inserire dati automaticamente in mysql PHP 0
B Vorrei inserire una finestra con messaggio ad un history.back PHP 16
Shyson Inserire placeholder nel campo cerca PHP 5
M Lanciare alert se il codice fiscale è già presente nel db e lasciare la scelta di inserire all'utente PHP 42
atipika INSERIRE ICONE DOWNLOAD E STAMPA WORDPRESS WordPress 10
F Creare un set di date a seconda del frazionamento scelto da inserire in MySQL PHP 6
B inserire valori da una tabella a un altra mysql PHP 34
D [Javascript] inserire uno script in un file php Javascript 6
napuleone [HTML] type="file" inserire path di partenza HTML e CSS 4
Monital [Javascript] inserire dati estratti dal db in html fisso Javascript 1
R [WordPress] Inserire campi aggiuntivi ad un Submit Form già dato dal template (front-end) WordPress 0
M inserire i dati ottenuti da una jquery in una tabella già esistente jQuery 1
G Inserire "Leggi il resto dell'articolo" con link al post sul sito preso via RSS Email Marketing 0
M [PHP] Come inserire codice html in un ciclo while PHP 2
P [PHP] Inserire stringhe in input(text),memorizzarle e stamparle in file successivo PHP 0
J [Javascript] Inserire un caricamento con animazione prima dell'esecuzione di un'azione Javascript 1
Shyson [PHP] Inserire testo nel codice PHP 2
D Mailchimp - Possibile inserire doppia condizione per i triggers? Email Marketing 0
A [MS Access] Pulsante per inserire allegati in campo maschera MS Access 0
Shyson [HTML] Inserire nuovo font con @font-face HTML e CSS 5
Alex_70 Inserire photo in php PHP 0
D [Javascript] [HTML] Inserire slash dopo 3 numeri Javascript 5
F INSERIRE IN UN'UNICA CASELLA DI TESTO REPORT ACCESS I VALORI DELLA TABELLA DI UN'INTERA COLONNA MS Access 2
A [HTML] Come inserire google review stars nelle pagine del mio sito HTML e CSS 0
spider81man Connettersi ad un DB ed inserire dati con Javascript Javascript 3
spider81man [PHP] Inserire file .pdf in db PHP 6
P [WordPress] Inserire codice in pagina dinamica WordPress 0
A [PHP] Ciclare array multidimensionale e inserire valori in DB PHP 2
M [PHP] Inserire array nel db PHP 6
andreas88 [HTML] come inserire 3 riquadri in un unico rigo (vedere img allegata) HTML e CSS 11
G [PHP] inserire risultato di una query in una tabella PHP 3
P [Javascript] Inserire una nuova condizione in una funzione Javascript 3
G [Guida MyBB 1.8] Inserire icone accanto alle sezioni CMS (Content Management System) 0
M [wordpress-galleria immagini]Inserire classe php in html PHP 0
C Inserire dati tabella leggendo parte di altra tabella con php PHP 13
crealatualista [PHP] Inserire nomi nel database PHP 1
B [WordPress] inserire pulsante like per ogni post WordPress 2
L [PHP] Inserire google recaptcha in uno form contatti PHP 1
A Inserire un link con illlustrator Webdesign e Grafica 0

Discussioni simili