2013-06-14 8 views
7

Mi piacerebbe che il testo nel campo del nome del file della finestra di dialogo di salvataggio di JFileChooser selezioni solo il nome del file e non l'estensione.Fare un JFileChooser seleziona il testo del nome del file ma non l'estensione

Al momento ho questo:

What it currently looks like

E voglio farlo sembrare come questo:

Ideally what it'd look like

Questo è un semplice cambiamento, ma uno che fa il salvataggio di un file molto più facile , a mio parere, poiché l'utente può iniziare a digitare il nome del file subito senza cancellare accidentalmente l'estensione.

So che posso aggiungere forzatamente l'estensione se manca, ma preferirei non farlo perché l'estensione non è obbligatoria e non credo debba essere applicata.

Quindi, c'è un modo per ottenerlo?

+0

Io non conosco la risposta, ma è una buona domanda, guarderò vedo cosa riesco a trovare. –

risposta

2

L'API non offre questo direttamente ma un modo semplice per farlo è scansionare la gerarchia dei componenti, cercando un JTextField e quindi modificare la selezione di quel campo di testo.

Ecco un esempio di questa soluzione:

import java.awt.Component; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 

import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class TestJFileChooser { 

    public TestJFileChooser() { 

    } 

    protected void initUI() { 
     JFrame frame = new JFrame(TestJFileChooser.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JButton button = new JButton("Click me"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JFileChooser chooser = new JFileChooser(); 
       chooser.setSelectedFile(new File(chooser.getCurrentDirectory(), "save.dat")); 
       final JTextField textField = getTexField(chooser); 
       if (textField != null) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          String text = textField.getText(); 
          if (text != null) { 
           int index = text.lastIndexOf('.'); 
           if (index > -1) { 
            textField.setSelectionStart(0); 
            textField.setSelectionEnd(index); 
           } 
          } 
         } 
        }); 
       } 
       chooser.showSaveDialog(button); 
      } 

      private JTextField getTexField(Container container) { 
       for (int i = 0; i < container.getComponentCount(); i++) { 
        Component child = container.getComponent(i); 
        if (child instanceof JTextField) { 
         return (JTextField) child; 
        } else if (child instanceof Container) { 
         JTextField field = getTexField((Container) child); 
         if (field != null) { 
          return field; 
         } 
        } 
       } 
       return null; 
      } 
     }); 
     frame.add(button); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestJFileChooser fc = new TestJFileChooser(); 
       fc.initUI(); 
      } 
     }); 
    } 
} 
+0

Un po 'più pesante di quanto speravo, ma funziona come un fascino. Grazie! – Kat

0

sembra che non è possibile configurare questo sul componente di default,

Credo che si dovrà estenderlo, questo tutorial vi aiuterà a:

https://today.java.net/pub/a/today/2007/02/22/how-to-write-custom-swing-component.html

+0

Si prega di evitare di postare [Solo risposte di collegamento] (http://meta.stackexchange.com/a/95691/186314). Questo non è molto utile e il tuo collegamento potrebbe rompersi ad un certo punto, perdendo tutte le informazioni rilevanti. –

0

ti credo puoi scrivere un JFileChooser personalizzato estendendo com.sun.java.swing.plaf.windows.WindowsFileChooserUI e sovrascrivi il suo metodo setFileName().

+0

Ma l'utente sembra essere su Linux (dalla L & F del suo screenshot). Ad ogni modo, non è affatto portatile. Non vorrei andare su quella strada. –

+0

@GuillaumePolet Sì, hai ragione. Non è portatile e sarà utile solo se sul sistema operativo Windows. – Mubin

Problemi correlati