2013-08-01 16 views
14

jakie napotkał ten błąd:Pulpit API nie jest obsługiwany na bieżącej platformie

java.lang.UnsupportedOperationException: Desktop API is not supported on the current platform 

Chciałbym otworzyć plik z mojej aplikacji java. Używam tej metody:

   Desktop.getDesktop().open(new File(report.html")); 

Jak mogę rozwiązać ten problem?

+0

z której platformy korzystasz? – null

+0

Używam ubuntu 13.04 .. – user2520969

+0

sprawdź to pytanie: http://stackoverflow.com/questions/102325/not-supported-platforms-for-java-awt-desktop-getdesktop – null

Odpowiedz

37

Zasadniczo problem polega na tym, że integracja Java Desktop nie działa dobrze w systemie Linux.

Został zaprojektowany do pracy z Windows; coś działa na innych systemach, ale nikt nie chciał dopuścić do tego właściwego wsparcia. Nawet jeśli zainstalujesz wymagane "biblioteki GNOME", wyniki będą słabe.

Napotkałem ten sam problem jakiś czas temu i wymyśliłem klasę poniżej.

Cel został osiągnięty za pomocą systemowych specyficznych poleceń:

KDE:  kde-open 
GNOME: gnome-open 
Any X-server system: xdg-open 
MAC:  open 
Windows: explorer 

Jeśli żadna z tych prac, próbuje realizację świadczonych przez Java Desktop.
Ponieważ zazwyczaj się nie udaje, jest to ostatnia deska ratunku.


klasa DesktopApi

Ta klasa udostępnia metody statyczne open, browse i edit.
Został przetestowany pod kątem działania na systemach Linux (Kde i Gnome), Windows i Mac.

Jeśli go używasz, proszę, daj mi kredyt.

package net.mightypork.rpack.utils; 

import java.awt.Desktop; 
import java.io.File; 
import java.io.IOException; 
import java.net.URI; 
import java.util.ArrayList; 
import java.util.List; 


public class DesktopApi { 

    public static boolean browse(URI uri) { 

     if (openSystemSpecific(uri.toString())) return true; 

     if (browseDESKTOP(uri)) return true; 

     return false; 
    } 


    public static boolean open(File file) { 

     if (openSystemSpecific(file.getPath())) return true; 

     if (openDESKTOP(file)) return true; 

     return false; 
    } 


    public static boolean edit(File file) { 

     // you can try something like 
     // runCommand("gimp", "%s", file.getPath()) 
     // based on user preferences. 

     if (openSystemSpecific(file.getPath())) return true; 

     if (editDESKTOP(file)) return true; 

     return false; 
    } 


    private static boolean openSystemSpecific(String what) { 

     EnumOS os = getOs(); 

     if (os.isLinux()) { 
      if (runCommand("kde-open", "%s", what)) return true; 
      if (runCommand("gnome-open", "%s", what)) return true; 
      if (runCommand("xdg-open", "%s", what)) return true; 
     } 

     if (os.isMac()) { 
      if (runCommand("open", "%s", what)) return true; 
     } 

     if (os.isWindows()) { 
      if (runCommand("explorer", "%s", what)) return true; 
     } 

     return false; 
    } 


    private static boolean browseDESKTOP(URI uri) { 

     logOut("Trying to use Desktop.getDesktop().browse() with " + uri.toString()); 
     try { 
      if (!Desktop.isDesktopSupported()) { 
       logErr("Platform is not supported."); 
       return false; 
      } 

      if (!Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { 
       logErr("BROWSE is not supported."); 
       return false; 
      } 

      Desktop.getDesktop().browse(uri); 

      return true; 
     } catch (Throwable t) { 
      logErr("Error using desktop browse.", t); 
      return false; 
     } 
    } 


    private static boolean openDESKTOP(File file) { 

     logOut("Trying to use Desktop.getDesktop().open() with " + file.toString()); 
     try { 
      if (!Desktop.isDesktopSupported()) { 
       logErr("Platform is not supported."); 
       return false; 
      } 

      if (!Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) { 
       logErr("OPEN is not supported."); 
       return false; 
      } 

      Desktop.getDesktop().open(file); 

      return true; 
     } catch (Throwable t) { 
      logErr("Error using desktop open.", t); 
      return false; 
     } 
    } 


    private static boolean editDESKTOP(File file) { 

     logOut("Trying to use Desktop.getDesktop().edit() with " + file); 
     try { 
      if (!Desktop.isDesktopSupported()) { 
       logErr("Platform is not supported."); 
       return false; 
      } 

      if (!Desktop.getDesktop().isSupported(Desktop.Action.EDIT)) { 
       logErr("EDIT is not supported."); 
       return false; 
      } 

      Desktop.getDesktop().edit(file); 

      return true; 
     } catch (Throwable t) { 
      logErr("Error using desktop edit.", t); 
      return false; 
     } 
    } 


    private static boolean runCommand(String command, String args, String file) { 

     logOut("Trying to exec:\n cmd = " + command + "\n args = " + args + "\n %s = " + file); 

     String[] parts = prepareCommand(command, args, file); 

     try { 
      Process p = Runtime.getRuntime().exec(parts); 
      if (p == null) return false; 

      try { 
       int retval = p.exitValue(); 
       if (retval == 0) { 
        logErr("Process ended immediately."); 
        return false; 
       } else { 
        logErr("Process crashed."); 
        return false; 
       } 
      } catch (IllegalThreadStateException itse) { 
       logErr("Process is running."); 
       return true; 
      } 
     } catch (IOException e) { 
      logErr("Error running command.", e); 
      return false; 
     } 
    } 


    private static String[] prepareCommand(String command, String args, String file) { 

     List<String> parts = new ArrayList<String>(); 
     parts.add(command); 

     if (args != null) { 
      for (String s : args.split(" ")) { 
       s = String.format(s, file); // put in the filename thing 

       parts.add(s.trim()); 
      } 
     } 

     return parts.toArray(new String[parts.size()]); 
    } 

    private static void logErr(String msg, Throwable t) { 
     System.err.println(msg); 
     t.printStackTrace(); 
    } 

    private static void logErr(String msg) { 
     System.err.println(msg); 
    } 

    private static void logOut(String msg) { 
     System.out.println(msg); 
    } 

    public static enum EnumOS { 
     linux, macos, solaris, unknown, windows; 

     public boolean isLinux() { 

      return this == linux || this == solaris; 
     } 


     public boolean isMac() { 

      return this == macos; 
     } 


     public boolean isWindows() { 

      return this == windows; 
     } 
    } 


    public static EnumOS getOs() { 

     String s = System.getProperty("os.name").toLowerCase(); 

     if (s.contains("win")) { 
      return EnumOS.windows; 
     } 

     if (s.contains("mac")) { 
      return EnumOS.macos; 
     } 

     if (s.contains("solaris")) { 
      return EnumOS.solaris; 
     } 

     if (s.contains("sunos")) { 
      return EnumOS.solaris; 
     } 

     if (s.contains("linux")) { 
      return EnumOS.linux; 
     } 

     if (s.contains("unix")) { 
      return EnumOS.linux; 
     } else { 
      return EnumOS.unknown; 
     } 
    } 
} 
+0

Dziękujemy! Działa z twoją klasą. – user2520969

+1

Mimo instalacji libgnome2-0 napraw to, my, jako programiści, musimy obejść te rzeczy. Dziękuję Ci! :-) –

+0

@MightyPork Dobre starania. Tak trzymaj. +1 dla * Cel osiąga się, używając poleceń specyficznych dla systemu *. – OO7

6

Klasa Desktop nie jest obsługiwana we wszystkich systemach.

Z Swing samouczka Java How to Integrate with the Desktop Class:

Use the isDesktopSupported() method to determine whether the Desktop API is available. On the Solaris Operating System and the Linux platform, this API is dependent on Gnome libraries. If those libraries are unavailable, this method will return false. After determining that the Desktop API is supported, that is, the isDesktopSupported() returns true, the application can retrieve a Desktop instance using the static method getDesktop().

W każdym razie, byłoby najlepiej, aby zapewnić alternatywny sposób otwierania pliku, jeśli nie ma wsparcia dla Desktop.

0

Obsługa różni się w zależności od implementacji w różnych pakietach JDK. Napotkano wyjątek "UnsupportedOperationException" za pomocą OpenJDK 1.7.0. Zmiana na Oracle JDK 1.7 zadziałała.

W niektórych przypadkach można przełączyć się z JDK lub zasugerować, aby użytkownicy przełączyli JDK, aby włączyć określoną funkcję.

15

Używam Ubuntu 12.04 LTS 64-bit z Oracle jdk1.6.0_45 i miałem ten sam problem. Używam gnome-classic jako pulpitu zamiast Unity. To jest to, co pracował dla mnie:

sudo apt-get install libgnome2-0 

Po zainstalowaniu tego pakietu I wznowiona moją aplikację Java Swing i Desktop.getDesktop().open(new File("myfile")); działało w porządku.

+0

Na komputerze CentOS 7 z uruchomionym XFCE, 'sudo yum install libgnome' zrobiło sztuczkę! – schneida

Powiązane problemy