Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [Java] Posizionarsi nella directory in cui viene lanciata l'app

    Salve gente,
    ho a che fare con un software scritto interamente in java che permettere di aprire o salvare dei circuiti.
    Vorrei chiedere come posso implementare il fatto di posizionarmi nella directory in cui si trova l'applicazione (il .jar) una volta che faccio file->open oppure file->save.
    Dato che ora ogni volta che faccio una delle due operazioni, mi posiziona in documenti e devo sempre andare a cercarmi la directory.

    Grazie mille

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Suppongo che tu usi il JFileChooser per permettere all'utente di salvare/aprire i file.
    Se non conosci a priori la directory in cui si trova il file Jar, dovrai ottenerlo in qualche modo. Un modo potrebbe essere quello di utilizzare il nome della classe che è in esecuzione. Supponendo che la tua classe si chiami "MiaClasse" e che il file JAR si chiami "MiaApp.jar" (dovrai, ovviamente, conoscere almeno il nome del file JAR, altrimenti si può fare lo stesso ma bisogna aggiungere della logica), con questo codice otterrai il percorso del JAR:

    codice:
        private String getMyPath() {
            String str = MiaClasse.class.getResource("MiaClasse.class").toExternalForm();
    
            int start = 0;
            int end = str.indexOf("MiaApp.jar");
            if ( str.startsWith("jar:") ) {
                start = 4;
            }
    
            if (str.indexOf("file:/") >= 0) {
                start += 6;
            }
    
            str = str.substring(start, end);
            str = str.replaceAll("%20", " ");
    
            return str;
        }
    Ora, per fare in modo che il JFileChooser si posizioni in quella directory, la cosa è banale:

    codice:
    JFileChooser jfc = new JFileChooser( ... );
    ...
    jfc.setCurrentDirectory( new File(getMyPath()) );
    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

  3. #3
    Ecco il metodo SaveAs per salvare con nome:
    codice:
    public void saveAs(){
        	JFileChooser chooser = new JFileChooser();
        	int returnVal = chooser.showSaveDialog (getFrame());
        	File f=null;
        	if (returnVal == JFileChooser.APPROVE_OPTION){
        	    f = chooser.getSelectedFile ();
        	    WriteFile wf;
        	    getPathName(f);
        	    System.out.println(pathSaved + ":" + nameSaved);
        	    try {
        	    	wf = new WriteFile(pathSaved,panel);
        	    	wf.writeFile();
        	    	isSaved=true;
        	    	frame.setTitle("Logic Ports - " + nameSaved);
        	    	isFirstSave=false;
        	    } catch (ParserConfigurationException e) {
        	    	e.printStackTrace();
        	    } catch (IOException e) {
        	    	e.printStackTrace();
        	    }  
        	}
    All'incirca lo stesso codice viene eseguito per l'apertura del file e per l'esportazione.
    Sai indicarmi come inserire il codice che hai scritto tu? Dato che non ho nessun .class (si tratta di un progetto formato da diversi package e molte classi).
    Il .jar si chiama LogicPorts

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    veramente ti ha anche detto come fare, dopo che istanzi il jfc inserisci l'istruzione

    codice:
    jfc.setCurrentDirectory( new File(getMyPath()) );
    Considera anche che ti ha scritto la funzione getMyPath() (che aggiungi in calce alla tua classe) quindi cosa deve fare ancora?
    Ti ha detto come ritrovare il path del jar che contiene la tua classe che tenta il salvataggio.

    Nota mia: questa soluzione la scarterei visto che il jar può essere in esecuzione in locazioni non autorizzate alla scrittura. Meglio la home o cmq un percorso di sicura garanzia scrittura

  5. #5
    Non ho capito cosa dovrei mettere al posto di MiaClasse???

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Fabietto206
    Non ho capito cosa dovrei mettere al posto di MiaClasse???
    Ma non mi pare di averlo scritto in una lingua incomprensibile: devi mettere il nome della TUA classe che sta eseguendo il metodo. L'ho anche scritto...


    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

  7. #7
    Ho fatto così ma non funziona:
    codice:
    public void saveAs(){
        	JFileChooser chooser = new JFileChooser();
        	chooser.setCurrentDirectory( new File(getMyPath()) );
        	int returnVal = chooser.showSaveDialog (getFrame());
        	File f=null;
        	if (returnVal == JFileChooser.APPROVE_OPTION){
        	    f = chooser.getSelectedFile ();
        	    WriteFile wf;
        	    getPathName(f);
        	    System.out.println(pathSaved + ":" + nameSaved);
        	    try {
        	    	wf = new WriteFile(pathSaved,panel);
        	    	wf.writeFile();
        	    	isSaved=true;
        	    	frame.setTitle("Logic Ports - " + nameSaved);
        	    	isFirstSave=false;
        	    } catch (ParserConfigurationException e) {
        	    	e.printStackTrace();
        	    } catch (IOException e) {
        	    	e.printStackTrace();
        	    }  
        	}    	
        }
        
        private String getMyPath() {
            String str = Facade.class.getResource("Facade.class").toExternalForm();
    
            int start = 0;
            int end = str.indexOf("LogicPorts.jar");
            if ( str.startsWith("jar:") ) {
                start = 4;
            }
    
            if (str.indexOf("file:/") >= 0) {
                start += 6;
            }
    
            str = str.substring(start, end);
            str = str.replaceAll("%20", " ");
    
            return str;
        }
    Entrambi i metodi sono posizionati nella classe Facade.
    Mi da come errore String index out of bounds exception

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ho capito tu andrai ad accedere a locazioni che non rientrano nei tuoi limiti, inizia con il farti stampare a video il path che hai e poi lo scompatti secondo i tuoi scopi

  9. #9
    Il mio intento è forse un altro allora: vorrei che ogni volta che viene fatto open o saveAs si apra la finestra posizionata nella directory in cui si trova il .jar e non si apra sempre la stessa directory.
    Così che se il software viene usato su altri pc, possa ridare una directory diversa.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Fabietto206
    Il mio intento è forse un altro allora: vorrei che ogni volta che viene fatto open o saveAs si apra la finestra posizionata nella directory in cui si trova il .jar e non si apra sempre la stessa directory.
    Così che se il software viene usato su altri pc, possa ridare una directory diversa.
    E' esattamente quello che tenta di fare il codice postato da me, ma evidentemente ci sono delle restrizioni sulla tua macchina che non gli permettono il corretto funzionamento.

    Prova a postare quello che viene stampato con questa istruzione, per cercare di capire come aggirare l'ostacolo:

    codice:
    System.out.println( Facade.class.getResource("Facade.class").toExternalForm() );
    E prova anche a dirci dove è situato in questo momento il JAR della tua applicazione.

    E, magari, anche il sistema operativo che stai usando... tutte queste rogne le ho avute solo su macchine che usano Win 7... è forse il peggior sistema operativo che Microsoft abbia mai sviluppato.

    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

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.