48 votes

Ne Swing prise en charge de Windows 7 fichier de style sélecteurs?

J'ai juste ajouté une norme "Ouvrir un fichier" boîte de dialogue pour une petite application de bureau, je suis en train d'écrire, basé sur l' JFileChooser entrée de la Balançoire Tutoriel. C'est la génération d'une fenêtre qui ressemble à ceci:

screenshot of unwanted/XP-style window

mais je préfère avoir une fenêtre qui ressemble à ceci:

screenshot of desired/7-style window

En d'autres termes, je veux que mon sélecteur de fichier pour Windows Vista/Windows 7 est un style, pas de Windows XP. Est-ce possible dans le Swing? Si oui, comment est-il fait? (Pour les fins de cette question, supposons que le code sera exécuté exclusivement sur les ordinateurs Windows 7.)

21voto

John McCarthy Points 1251

Il n'apparaît pas c'est pris en charge dans les Swing en Java 6.

Actuellement, la façon la plus simple que je peux trouver pour ouvrir cette boîte de dialogue est par le biais de SWT, pas de Swing. SWT est FileDialog (javadoc) fait apparaître cette boîte de dialogue. Ce qui suit est une modification de SWT est FileDialog extrait d'utiliser un ouvre à la place de la boîte de dialogue enregistrer. Je sais que ce n'est pas exactement ce que vous cherchez, mais vous pouvez isoler cet pour une classe utilitaire et ajouter swt.jar pour votre classpath pour cette fonctionnalité.

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class SWTFileOpenSnippet {
    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell (display);
        // Don't show the shell.
        //shell.open ();  
        FileDialog dialog = new FileDialog (shell, SWT.OPEN | SWT.MULTI);
        String [] filterNames = new String [] {"All Files (*)"};
        String [] filterExtensions = new String [] {"*"};
        String filterPath = "c:\\";
        dialog.setFilterNames (filterNames);
        dialog.setFilterExtensions (filterExtensions);
        dialog.setFilterPath (filterPath);
        dialog.open();
        System.out.println ("Selected files: ");
        String[] selectedFileNames = dialog.getFileNames();
        for(String fileName : selectedFileNames) {
            System.out.println("  " + fileName);
        }
        shell.close();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }
} 

10voto

Alexey Ivanov Points 6564

Même natif des applications Windows pouvez obtenir ce type de dialogue affichée sur Windows 7. Ceci est généralement contrôlée par des drapeaux en OPENFILENAME structure et sa taille passé dans un appel à WinAPI fonction GetOpenFileName. Swing (Java) utilise des crochets pour des événements à partir de la boîte de dialogue Ouvrir Fichier; ces événements sont transmis de manière différente entre Windows XP et Windows 7 version.

Donc la réponse est que vous ne pouvez contrôler l'apparence de FileChooser de Swing. Toutefois, lorsque Java obtient un soutien pour ce nouveau look, vous obtiendrez le nouveau style automatiquement.

Une autre option est d'utiliser SWT, comme il est suggéré dans cette réponse. Alternativement, vous pouvez utiliser la JNA à l'appel de l'API Windows ou écrire une méthode native pour ce faire.

8voto

Luke Usherwood Points 687

Java 8 peut enfin apporter une solution à ce problème, mais malheureusement (pour le Swing apps) il s'agit uniquement que de la classe JavaFX FileChooser:

J'ai testé ce code à partir d' ici, et en effet les pop moderne, une boîte de dialogue (Windows 7, cliquez ici):

        FileChooser fileChooser = new FileChooser();

        //Set extension filter
        FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
        FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
        fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);

        //Show open file dialog
        File file = fileChooser.showOpenDialog(null);

Comment intégrer cela dans un Swing d'application, cependant, je ne sais pas. Le problème est que Swing/AWT et JavaFX ont d'événements distincts de fils. (Dans le JavaFX cas, c'est en fait le système d'exploitation natif de l'événement de fil, j'imagine.) Cependant il y a des normes à ce sujet. (Voir ce Tutoriel).

Malheureusement, je ne suis pas en mesure de passer mon code pour Java 8 pour l'instant, donc je n'ai pas vraiment le temps de jouer en ce moment. Je vais revenir et modifier ce post si/quand j'ai terminé ce puzzle. (Ou peut-être une autre âme charitable pourrait le faire, si ils me battre pour elle, d'où le wiki de la communauté de " drapeau)

7voto

Andrew Thompson Points 108505

Un peu un hack, et un peu moins de poids que le Swing version, mais avez-vous songé à utiliser un java.awt.FileDialog? Il ne faut pas juste regarder comme les Fenêtres sélecteur de fichier, mais en réalité être un.

7voto

mezmo Points 1678

Je ne crois pas Swing couvrirait que si elle peut, si cela ne fonctionne pas, vous pourriez avoir besoin de regarder quelque chose comme SWT, qui permettrait de faire usage de la réelle composants natifs, ou faire une coutume élément de l'INTERFACE utilisateur, comme quelque chose de "Sale les Clients Riches" livre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X