2009-02-08 17 views
12

J'essaie de comprendre comment ouvrir l'éditeur de système préféré pour un fichier donné.Comment ouvrir un éditeur de système d'utilisateur préféré pour un fichier donné?

Dites, nous avons un gestionnaire de fichiers, écrit en Java. L'utilisateur va dans le dossier et voit la liste des fichiers. Et, par exemple, il y a un fichier Icon.jpg. L'utilisateur double-clique sur le nom de fichier et le fichier s'ouvre dans l'éditeur préféré du système (c'est-à-dire Gimp). Le principal problème est - comment faire cela?

Nous pouvons faire Runtime.getRuntime().exec("something file"), mais de cette façon, vous devez savoir quel programme est préféré dans l'environnement de l'utilisateur. Mais comment?

Nous sommes également en mesure de faire Desktop.getDesktop().edit(File file), mais de cette façon, nous ne pouvons pas suivre le processus et ne sont pas en mesure de savoir alors ce processus de l'enfant est fermé. L'autre question-fonction ne fonctionne pas sous linux (au moins sur Ubuntu 8.10). Il y a également Desktop.getDesktop().open(File file), mais il force l'ouverture de la visionneuse de fichiers au lieu de la visionneuse de système pour ce type de fichier.

Je suis à la recherche d'une solution toute la semaine, mais je n'ai pas trouvé de solution générique. Connaissez-vous les autres approches à cette question? Pour mon projet, il suffirait que cela fonctionne sur Windows + Linux + Mac.

Nous vous remercions de vos réponses et de vos conseils.

Modifier sur 2009-02-08 23:04

Autre suggestion: puis-je forcer la fenêtre "de sélection d'applications" dans Windows et sous Linux, comme dans Mac avec "fichier ouvert"? Par exemple, alors vous essayez d'ouvrir le fichier, vous êtes invité à choisir l'application de la liste des systèmes préférés? (quelque chose comme "Ouvrir avec ..." dans Windows Explorer). Savez-vous?

+0

Autre suggestion: puis-je forcer la fenêtre "de sélection d'applications" dans Windows et sous Linux, comme dans Mac? Par exemple, alors vous essayez d'ouvrir le fichier, puis vous êtes invité à choisir l'application de la liste des choix prédéfinis du système? (quelque chose comme "Ouvrir avec ..." dans Windows Explorer). Le savez-vous? –

Répondre

7

il semble que si vous ne pouvez pas utiliser java.awt.Desktop il faut distinguer entre les systèmes d'exploitation: Windows:

RUNDLL32.EXE SHELL32.DLL,OpenAs_RunDLL <file.ext> 

Linux:

edit <file.ext> 

Mac:

open <file.ext> 

HTH. De toute évidence, ce n'est pas très portable ...

+0

Ce sont des commandes de console, que je suis supposé écrire dans la fonction Runtime.getRuntime(). Exec(), n'est-ce pas? –

+0

@ArturasSmorgun, c'est vrai –

+0

Notez que 'OpenAs_RunDLL' est non documenté et [ne fonctionne pas toujours.] (Http://stackoverflow.com/questions/23566667/rundll32-shell32-dll) –

2

Ce n'est pas multi-plateforme, mais sur Mac OS X que vous pouvez faire

Runtime.getRuntime().exec("open filename"); 

L'exécutable open(1) utilise LaunchServices pour choisir le bon programme à exécuter, et utilise ensuite que pour ouvrir le fichier nommé filename .

+0

Merci, je vais essayer ça. C'est très utile pour moi, car pour le moment je ne peux tester mon code que sur Ubuntu et Linux et je ne sais pas comment ça se passe sur Mac. :) –

7

Extrayez l'objet java.awt.Desktop. Dans votre cas, vous voulez invoquer edit()

Si vous voulez vous assurer qu'une plate-forme donnée soutient cet appel, alors vous pouvez faire quelque chose comme ce qui suit (je ne l'ai pas testé ce code):

public boolean editFile(final File file) { 
    if (!Desktop.isDesktopSupported()) { 
    return false; 
    } 

    Desktop desktop = Desktop.getDesktop(); 
    if (!desktop.isSupported(Desktop.Action.EDIT)) { 
    return false; 
    } 

    try { 
    desktop.edit(file); 
    } catch (IOException e) { 
    // Log an error 
    return false; 
    } 

    return true; 
} 
+0

Je sais bien que edit() ne fonctionne pas sur Ubuntu. Mais cette fonctionnalité est requise pour moi. Savez-vous ce que je suis supposé faire si edit() n'est pas supporté? –

-2

Cela fonctionne dans les fenêtres

Runtime.getRuntime().exec("CMD /C START filename.ext "); 
+0

Non. Ce ne sera pas; p – westman379