2011-09-21 11 views
8

Ive ha implementato jFileChooser nel mio programma da riga di comando e funziona, proprio come dovrebbe con un solo problema fastidioso. Sembra che si apre sotto ogni finestra senza alcun tipo di avviso. Anzi, all'inizio, mi è mancato persino un paio di volte, portandomi a credere di averlo sbagliato.JFileChooser da un programma a riga di comando e spuntando Sotto tutte le finestre

ho implementato in questo modo:

System.out.println("Please select the file"); 
JFileChooser fc = new JFileChooser(); 
int retValue = fc.showOpenDialog(new JPanel()); 
if(retValue == JFileChooser.APPROVE_OPTION){ 
    g.inputFile = fc.getSelectedFile(); 
}else { 
    System.out.println("Next time select a file."); 
    System.exit(1); 
} 

In sostanza voglio solo il JFileChooser in modo da avere all'utente di selezionare un file come un file di input. Questo è l'unico componente che ha bisogno di un'implementazione della GUI, quindi se posso evitare di scrivere una GUI, sarebbe utile.

+0

vedere ** Modifica 2 ** nella mia risposta qui sotto. –

+0

Questo thread può o non può aiutare: http: // StackOverflow.it/questions/5129294/bring-jfilechooser-on-top-of-all-windows – Zammbi

risposta

10

Così, dopo aver provato una varietà di cose da diversi argomenti di overflow dello stack ho finito con un risultato che modo coerente e affidabile apre sopra ogni finestra su Windows 7.

public class ChooseFile { 
    private JFrame frame; 
    public ChooseFile() { 
     frame = new JFrame(); 

     frame.setVisible(true); 
     BringToFront(); 
    } 
    public File getFile() { 
     JFileChooser fc = new JFileChooser(); 
     if(JFileChooser.APPROVE_OPTION == fc.showOpenDialog(null)){ 
      frame.setVisible(false); 
      return fc.getSelectedFile(); 
     }else { 
      System.out.println("Next time select a file."); 
      System.exit(1); 
     } 
     return null; 
    } 

    private void BringToFront() {     
        frame.setExtendedState(JFrame.ICONIFIED); 
      frame.setExtendedState(JFrame.NORMAL); 

    } 

} 

Così com'è nel mio programma è un classe interna ed è invocato chiamando:

+0

Questo mi ha aiutato immensamente. Solo queste 5 righe in un blocco proprio prima dell'uso di JFileChooser risolvono tutto: ** jFrame finale jFrame; jFrame = new JFrame(); jFrame.setVisible (true); jFrame.setExtendedState (JFrame.ICONIFIED); jFrame.setExtendedState (JFrame.NORMAL); ** –

+0

In realtà sto cercando una soluzione ancora più semplice qui (senza JFrame): http://stackoverflow.com/questions/17438630/how-to-generate-a-stand-alone -jfilechooser-dialog-box-on-top-of-other-windows ... ma non sembra che avrò risposte facili da implementare come questa. –

+0

Grazie per l'aiuto! L'ho personalizzato per le mie esigenze! Funziona davvero! –

4

penso a due possibili cause per qualcosa di simile:

  • Stai cercando di mescolare AWT e Swing GUI nello stesso programma, o
  • Stai cercando di mescolare un programma di console (cioè, usando System.out.println (...) e ottenendo input tramite un oggetto Scanner) con una GUI Swing.

Se si sta facendo una di queste due cose, è necessario semplificare e renderlo solo un programma di tipo GUI Swing. Se questa informazione non è di aiuto, potresti volerci dare maggiori informazioni sul tuo problema.

Modifica 1
Ho appena notato i dettagli del tuo codice. Le nuove JPanel() parte sotto è un problema:

int retValue = fc.showOpenDialog(new JPanel()); 

Per rendere l'atto JFileChooser come dialogo alla finestra di livello superiore (che non sta facendo, e che è il tuo problema principale), si dovrebbe invece, passa un componente che si trova nella finestra di livello superiore genitore, ad esempio JPanel o JButton conservato all'interno di JFrame o JApplet.

Edit 2
OK, si sta cercando di mescolare un programma di console Java con un programma GUI swing che è come mangiare il gelato con sottaceti - solo che non vanno bene insieme. Non esiste una finestra di livello superiore da offrire al metodo showOpenDialog di JFileChooser in modo che funzioni come una vera finestra di dialogo.

La soluzione migliore è quella di non eseguire questa operazione, invece di riscrivere l'applicazione in modo che sia una GUI Swing completa.

3

Nel mio codice, posso solo usare null e funziona. Sto usando Java 7 su Windows 7.

JFileChooser chooser = new JFileChooser(System.getProperty("java.class.path")); 
FileNameExtensionFilter filter = new FileNameExtensionFilter("CSV files", "csv"); 
chooser.setFileFilter(filter); 
int returnVal = chooser.showOpenDialog(null); 
if(returnVal == JFileChooser.APPROVE_OPTION) { 
try { 
    Scanner inputFile= new Scanner(new File(chooser.getSelectedFile().getAbsolutePath())); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
} 
+0

Bella risposta diretta senza un sermone. Posso confermare che il codice sopra riportato funziona in 1.7 e 1.8. – Frelling

Problemi correlati