2016-03-22 3 views
0

Je veux ouvrir une application pendant l'exécution dans Mac en utilisant netbeans j'ai utilisé le code suivant mais il jette une exception. J'ai utilisé ce code pour les fenêtres avec peu de changements je l'ai utilisé dans Mac. Quelqu'un peut-il me suggérer le bon code?ouvrir une application pendant l'exécution dans Mac OSX en utilisant netbeans

else 
    { 
    try { 

     Runtime r = Runtime.getRuntime(); 

     p = Runtime.getRuntime().exec("/Applications/TextEdit.app /Users/apple/Documents/java files/scratch files/hi.rtf"); 


     A4 a4sObj = new A4(new String[]{jComboBox2.getSelectedItem().toString()}); 


    } catch (IOException ex) { 
     Logger.getLogger(serialportselection.class.getName()).log(Level.SEVERE, null, ex); 
    } 


}  
+1

Vous pouvez utiliser 'Desktop.edit' si vous voulez appeler l'éditeur « par défaut » pour la fichier, voir [Comment intégrer avec la classe Desktop] (https://docs.oracle.com/javase/tutorial/uiswing/misc/desktop.html) pour plus de détails – MadProgrammer

+0

supposons que je souhaite ouvrir d'autres applications pas de défaut alors cette classe ne sera pas utile pour moi –

+0

Les applications Mac ne sont qu'un "dossier" spécial, donc vous ne pouvez pas les "exécuter", vous devez plutôt regarder dans le répertoire 'Contents/MacOS' (du paquet de l'application), qui pourrait ressembler plus à '/ Applications/TextEdit.app/Contents/MacOS/TextEdit'. Je recommande également d'utiliser 'ProcessBuilder' sur' Process' directement – MadProgrammer

Répondre

2

D'accord, cela a pris un peu de creuser. Il semble que la méthode préférée pour exécuter un ensemble .app consiste à utiliser la commande open. Pour obtenir l'application pour ouvrir un fichier, vous devez utiliser le paramètre -a, par exemple ...

import java.io.IOException; 
import java.io.InputStream; 

public class Test { 

    public static void main(String[] args) { 
     String cmd = "/Applications/TextEdit.app"; 
     //String cmd = "/Applications/Sublime Text 2.app"; 
     String fileToEdit = "/Users/.../Documents/Test.txt"; 

     System.out.println("Cmd = " + cmd); 
     ProcessBuilder pb = new ProcessBuilder("open", "-a", cmd, fileToEdit); 
     pb.redirectErrorStream(true); 
     try { 
      Process p = pb.start(); 
      Thread t = new Thread(new InputStreamConsumer(p.getInputStream())); 
      t.start(); 
      int exitCode = p.waitFor(); 
      t.join(); 
      System.out.println("Exited with " + exitCode); 
     } catch (IOException | InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static class InputStreamConsumer implements Runnable { 

     private InputStream is; 

     public InputStreamConsumer(InputStream is) { 
      this.is = is; 
     } 

     @Override 
     public void run() { 
      int read = -1; 
      try { 
       while ((read = is.read()) != -1) { 
        System.out.print((char)read); 
       } 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

    } 

} 
+0

J'ai utilisé votre code pour ouvrir un fichier "hi.txt" mais il imprime le Cmd suivant = /Application/TextEdit.app Le fichier /users/apple/Documents/hi.txt n'existe pas. Exit with 1 –

+0

Cela va sembler stupide, mais essayez d'utiliser le nouveau fichier ("/ users/apple/Documents/hi.txt"). Exists() 'et assurez-vous que l'existe et est accessible par l'utilisateur actuel. – MadProgrammer

+0

non ça ne fonctionne pas comme prévu –