2013-06-14 8 views
7

Chciałbym tekst w polu nazwy pliku okna dialogowego zapisu JFileChooser, aby wybrać tylko nazwę pliku, a nie rozszerzenie.Dokonywanie JFileChooser wybierz tekst nazwy pliku, ale nie rozszerzenie

Obecnie mam to:

What it currently looks like

I ma to wyglądać tak:

Ideally what it'd look like

Jest to prosta zmiana, ale taki, który sprawia, że ​​zapis pliku o wiele łatwiej , moim zdaniem, ponieważ użytkownik może zacząć wpisywać nazwę pliku od razu, nie usuwając przypadkowo rozszerzenia.

Wiem, że mogę na siłę dodać rozszerzenie, jeśli go brakuje, ale wolałbym tego nie robić, ponieważ rozszerzenie nie jest obowiązkowe i nie uważam, że powinno być ono egzekwowane.

Czy jest jakiś sposób, aby to osiągnąć?

+0

ja nie znam odpowiedzi, ale to jest dobre pytanie, będę patrzeć na zobaczyć, co mogę znaleźć. –

Odpowiedz

2

Interfejs API nie oferuje tego bezpośrednio, ale jednym prostym sposobem jest zeskanowanie hierarchii komponentów, poszukiwanie JTextField, a następnie zmiana wyboru tego pola tekstowego.

Oto przykład tego rozwiązania:

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

Trochę cięższe, niż miałem nadzieję, ale działa jak urok. Dzięki! – Kat

0

wydaje się, że to nie jest możliwe, aby skonfigurować to na komponencie domyślnym

Chyba będziesz musiał go przedłużyć, ten poradnik pomoże Ci:

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

+0

Należy unikać zamieszczania [odpowiedzi na łącza] (http://meta.stackexchange.com/a/95691/186314). Nie jest to zbyt pomocne, a Twój link może się w pewnym momencie zepsuć, tracąc wszystkie istotne informacje. –

0

wierzę ci można napisać niestandardowy JFileChooser przez rozszerzenie com.sun.java.swing.plaf.windows.WindowsFileChooserUI i zastąpić jego metodę setFileName().

+0

Ale użytkownik wydaje się być na Linuksie (z L & F swojego zrzutu ekranu). W każdym razie to wcale nie jest przenośne. Nie pójdę tą drogą. –

+0

@GuillaumePolet Tak, masz rację. Nie jest przenośny i będzie przydatny tylko w systemie operacyjnym Windows. – Mubin

Powiązane problemy