# Fehler in Desktop.getDesktop().open()?



## Daniel_L (6. Mai 2009)

Kann es sein, dass die Desktop-Funktion nicht korrekt funktioniert? Ich habe einen jEditorPane, und darin verlinke ich bestimmte Einträge. Mal URLs, mal E-Mail-Adressen, mal Dateien auf der Festplatte. Der HyperlinkEventListener ruft dann eine Methode auf, um den Link zu öffnen:

```
/**
     * This method opens a file or URL either from within a clicked link 
     * inside the jEditorPane (see
     * {@link #eventHyperlinkActivated(javax.swing.event.HyperlinkEvent)
     *  eventHyperlinkActivated(javax.swing.event.HyperlinkEvent)}
     * or from the attachment-list (see {@link #openAttachment() openAttachment()}.
     *
     * @param linktype the clicked link as string
     * @param linkurl the clicked link as URL
     */
    private void openHyperlink(String linktype) {
        File linkfile = null;
        // check whether we have desktop-support here or not...
        if (Desktop.isDesktopSupported()) {
            // get the desktop
            Desktop desk = Desktop.getDesktop();
            // if yes, proceed...
            try {
                // if the string contains "http://", we assume we have a webpage
                if (CCommonMethods.isHyperlink(linktype)) {
                	... // öffnet Hyperlinks
                }
                // if the string starts with "mailto:", we assume we have an email-link
                else if (linktype.startsWith("mailto:")) {
                	... // öffnet E-Mail
                }
                // otherwise try to open the file with the associated application
                else {
                    // create file from the link
                    // this method returns a valid, absolute file-path to the 
                    // linked file. if the file does not exist, 
                    // this method returns "null".
                    linkfile = CCommonMethods.getLinkFile(settings,linktype);
                    // check whether opening a file is supported or not
                    if (!desk.isSupported(Desktop.Action.OPEN)) {
                        // display error message box
                        JOptionPane.showMessageDialog(getFrame(),
                                      getResourceMap().
                                      getString("errLinkUnsopportedMsg"),
                                      getResourceMap().getString("errLinkUnsopportedTitle"),
                                      JOptionPane.ERROR_MESSAGE, 
                                      CConstants.iconMsgError);
                        return;
                    }
                    desk.open(linkfile);
                }
            }
            catch (IOException e) {
                // display error message box
                JOptionPane.showMessageDialog(getFrame(),
                          getResourceMap().getString("errLinkNotFoundMsg",(linkfile!=null)?
                             linkfile.toString():
                             getResourceMap().getString("linkFileUnknown")),
                          getResourceMap().getString("errLinkNotFoundTitle"),
                          JOptionPane.ERROR_MESSAGE, 
                          CConstants.iconMsgError);
            }
            catch (IllegalArgumentException e) {
                // display error message box
                JOptionPane.showMessageDialog(...);
            }
            catch (SecurityException e) {
                // display error message box
                JOptionPane.showMessageDialog(...);
            }
            catch (UnsupportedOperationException e) {
                // display error message box
                JOptionPane.showMessageDialog(...);
            }
            catch (URISyntaxException e) {
                // display error message box
                JOptionPane.showMessageDialog(...);
            }
        }
        else {
            // display error message box
            JOptionPane.showMessageDialog(...);
        }
    }
```

URLs und Mailto klappt wunderbar, open für _Dateien_ nur manchmal, meistens nicht. Eine Systematik habe ich noch nicht erkennen können. Beim Debuggen jedesmal genau gesehen, dass die zu öffnende Datei existiert, keine kryptischen Zeichen oder Leerzeichen vorhanden sind, aber nichts tut sich... Auch keine Exception!

Das Problem tritt unter Windows/Mac/Linux auf.

Weiß jemand, woran das liegen könnte?


----------



## The_S (6. Mai 2009)

Bei manchen Dateien, oder funktionierts mal bei ner Datei und mal bei der selben Datei nicht? Kannst du uns so eine Datei zur Verfügung stellen? Und lass dir auch mal den Dateinamen direkt vorm Öffnen ausgeben.


----------



## Daniel_L (11. Mai 2009)

Hallo,

Ich hatte die E-Mail-Benachrichtigung nicht eingestellt, daher antworte ich erst jetzt. Ich versuche, heute Abend mal ein paar Beispiele zu finden und melde mich heute Abend wieder.



> Und lass dir auch mal den Dateinamen direkt vorm Öffnen ausgeben.


Ich habe die Variable immer im Debugger genau geprüft, der Pfad zur Datei stimmt exakt - andernfalls würde auch, und das funktioniert, eine IOException für den FileNotFound ausgeworfen... Aber ich schau das noch mal exakt an.


----------



## Daniel_L (30. Mai 2009)

So, ich weiß nicht, woran es liegt, aber ich habe das jetzt so "gelöst":

```
// check whether we have windows os. if yes, use runtime exec instead of desktop
if (settings.IS_WINDOWS) {
  Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL \""+linkfile.toString()+"\"");
}
else {
  desk.open(linkfile);
}
```

Die Datei existiert definitiv, die exists()-Methode gibt true zurück, aber mit der Desktop-API-open-Methode tut sich unter Windows nichts. Mit der getRuntime() schon. Ich verwende NetBeans 6.5.1 unter Mac OS X und auch unter Windows XP mit JDK/JRE 6u14.

Links (URLs) auf Webseiten werden übrigens normal im Browser geöffnet. Nur Dateien offensichtlich nicht.


----------

