Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Uso di JFilechooser

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    315

    Uso di JFilechooser

    Salve,
    devo fare in modo che un utente possa selezionare un particolare file; una volta selezionato verrà richiamato un metodo di un altra classe a cui passo il path del file.

    In questa classe che ho fatto

    codice:
    package it.gui;
    
    import it.gui.controller.SelectMessageController;
    import java.io.File;
    import javax.swing.filechooser.*;
    import javax.swing.JFileChooser;
    
    public class SelectMsgFrame extends javax.swing.JFrame {
    
    	static SelectMessageController _controller = null;
    	
    	public SelectMsgFrame(SelectMessageController theController) {
    		_controller = theController;
    		initComponents();
    	}
    
    	private void initComponents() {
    
    		_mainPnl = new javax.swing.JPanel();
    		_titlePnl = new javax.swing.JPanel();
    		_titleSeperator = new javax.swing.JSeparator();
    		_titleLbl = new javax.swing.JLabel();
    		_centerPnl = new javax.swing.JPanel();
    		_chooser = new javax.swing.JFileChooser();
    
    		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
    		_mainPnl.setLayout(new java.awt.BorderLayout());
    
    		_titlePnl.setLayout(new java.awt.BorderLayout());
    		_titlePnl.add(_titleSeperator, java.awt.BorderLayout.SOUTH);
    
    		_titleLbl.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    		_titleLbl.setText("Store Message");
    		_titlePnl.add(_titleLbl, java.awt.BorderLayout.CENTER);
    
    		_mainPnl.add(_titlePnl, java.awt.BorderLayout.NORTH);
    
    		_chooser.removeChoosableFileFilter (_chooser.getAcceptAllFileFilter ());
    		
    		_chooser.setApproveButtonText("Send");
    		
    		_chooser.addChoosableFileFilter (new FileFilter () {
    		    public boolean accept (File f) {
    		        return f.isDirectory() || f.getName().endsWith (".txt");
    		    }
    		    public String getDescription () {
    		        return "File TXT";
    		    }
    		});
    		
    		int returnVal = _chooser.showOpenDialog(null);
    	    if(returnVal == JFileChooser.APPROVE_OPTION) {
    	    	sendFile();
    	    }
    		_centerPnl.setLayout(new java.awt.BorderLayout());
    
    		_centerPnl.add(_chooser, java.awt.BorderLayout.CENTER);
    
    		_mainPnl.add(_centerPnl, java.awt.BorderLayout.CENTER);
    
    		getContentPane().add(_mainPnl, java.awt.BorderLayout.CENTER);
    
    		pack();
    	}
    
            public static void main(String args[]) {
    		java.awt.EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				new SelectMsgFrame(_controller).setVisible(true);
    			}
    		});
    	}
    
    	//GEN-BEGIN:variables
    	// Variables declaration - do not modify
    	private javax.swing.JPanel _centerPnl;
    	private javax.swing.JPanel _mainPnl;
    	private javax.swing.JLabel _titleLbl;
    	private javax.swing.JPanel _titlePnl;
    	private javax.swing.JSeparator _titleSeperator;
    	private javax.swing.JFileChooser _chooser;
    	// End of variables declaration//GEN-END:variables
    	
    	private void sendFile(){
    		_controller.send(_chooser.getSelectedFile().getAbsolutePath());
    	}
    
    }
    1) come faccio a fare in modo che quando viene inviato il path si chuda il frame?

    2) come posso gestire il secondo pulsantino che mi esce "Annulla"?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Uso di JFilechooser

    Originariamente inviato da koala81
    1) come faccio a fare in modo che quando viene inviato il path si chuda il frame?
    Facciamo una premessa: non ha molto senso (e non è nemmeno un buon "design") che tu mostri un file chooser durante il processo di inizializzazione dell'oggetto SelectMsgFrame. Certo ... lo fai nel metodo initComponents() ma esso è richiamato dal costruttore. E in quel punto il frame non è ancora nemmeno visibile .... lo sarà solo dopo che l'oggetto è stato costruito e su cui poi invochi il setVisible(true) nel run()!!!

    E questo già risponde alla tua domanda. Se il tuo frame non è ancora nemmeno visibile ... che senso ha volerlo chiudere quando è stata approvata la selezione nel file chooser???

    Prima di fare obbrobri di questo tipo pensaci non 2 ma anche 5 volte....

    Originariamente inviato da koala81
    2) come posso gestire il secondo pulsantino che mi esce "Annulla"?
    I metodi showXXXDialog di JFileChooser possono ritornare una delle 3 costanti: CANCEL_OPTION, APPROVE_OPTION, ERROR_OPTION. Certo ... puoi testare quindi quello che ti pare. Ma in genere tipicamente si testa solo se il ritorno è APPROVE_OPTION, cioè: "se la selezione è approvata allora fai qualcosa .. altrimenti niente"
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    Re: Re: Uso di JFilechooser

    Originariamente inviato da andbin
    Facciamo una premessa: non ha molto senso (e non è nemmeno un buon "design") che tu mostri un file chooser durante il processo di inizializzazione dell'oggetto SelectMsgFrame. Certo ... lo fai nel metodo initComponents() ma esso è richiamato dal costruttore. [...]
    Non si vede nemmeno che è codice autogenerato da un IDE, vero?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    315
    Proprio per questo mi sono rivolto a voi, perchè mi sono reso conto che quello che stavo facendo non andava bene.

    E mi interessa molto fare una cosa pulita anche da un punto di vista di design.

    Come fareste voi questa cosa? Il JFrame posso anche non farlo?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da koala81
    E mi interessa molto fare una cosa pulita anche da un punto di vista di design.

    Come fareste voi questa cosa? Il JFrame posso anche non farlo?
    Ok, ma allora innanzitutto bisognerebbe capire alcune cose:

    a) A che cosa ti serviva/servirebbe il frame SelectMsgFrame??
    b) Quando, intendo dire in quale momento e a seguito di quale "evento" vuoi mostrare la dialog del JFileChooser?
    c) Oltre a invocare quel send() su quell'oggetto SelectMessageController, cosa vuoi fare eventualmente di altro quando l'utente approva la selezione del chooser?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    315
    a) A che cosa ti serviva/servirebbe il frame SelectMsgFrame??
    Praticamente a nulla, è una classe di un progetto già esistente e al momento non posso sconvolgere il class diagram. Deve essere solo il contenitore del file chooser, nulla di più.ù

    b) Quando, intendo dire in quale momento e a seguito di quale "evento" vuoi mostrare la dialog del JFileChooser?
    conseguenza di prima, subito. Praticamente da un'altra classe verrà richiamato il costruttore di SelectMsgFrame(SelectMessageController theController) che farà aprire immediatamente il filechooser, allo scopo di selezionare un file da passare al metodo del controller.

    c) Oltre a invocare quel send() su quell'oggetto SelectMessageController, cosa vuoi fare eventualmente di altro quando l'utente approva la selezione del chooser?
    L'utente sceglie il file e preme send. La finestra scompare. Se l'utente preme Annulla la finestra scompare senza aver invocato send().

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da koala81
    Praticamente a nulla, è una classe di un progetto già esistente e al momento non posso sconvolgere il class diagram. Deve essere solo il contenitore del file chooser, nulla di più.
    Ma vuoi comunque rendere visibile questo tuo SelectMsgFrame? Va bene.

    Originariamente inviato da koala81
    conseguenza di prima, subito. Praticamente da un'altra classe verrà richiamato il costruttore di SelectMsgFrame(SelectMessageController theController) che farà aprire immediatamente il filechooser, allo scopo di selezionare un file da passare al metodo del controller.

    L'utente sceglie il file e preme send. La finestra scompare. Se l'utente preme Annulla la finestra scompare senza aver invocato send().
    Allora nel costruttore potresti fare questa sequenza:

    - Un setVisible(true) per visualizzare il frame.
    - La creazione/impostazione/visualizzazione del file chooser e se la selezione è approvata farai quel send.
    - Un dispose() per chiudere il frame in ogni caso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    315
    Ma il parametro di tipo Component di showOpenDialog() deve essere sempre null anche se mi trovo in un frame?

    ho visto vari esempi in rete che usano parent, ma a me dice che non è visibile...

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da koala81
    Ma il parametro di tipo Component di showOpenDialog() deve essere sempre null anche se mi trovo in un frame?
    Tecnicamente puoi passare un qualunque Component. La cosa più semplice che puoi fare è passare this cioè appunto il frame stesso. Almeno così il chooser è "modale" rispetto al frame.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.