es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿El comando Desktop#browse es compatible con la plataforma Linux únicamente en el entorno de escritorio Gnome?

Ejecutar mi aplicación Java con este código:

if (Desktop.isDesktopSupported()) {
    Desktop d = Desktop.getDesktop();
    try {
        d.browse(new URI("someurl")); // someurl es solo un ejemplo, estoy abriendo una URL real
    } catch (IOException | URISyntaxException e) {
        logger.warn(ExceptionUtils.getStackTrace(e));
    }
}

resulta en que la aplicación no responde (probablemente un bloqueo) en Manjaro Linux KDE. Mientras que funciona sin problemas en Windows, no quiero verificar el sistema operativo en mi aplicación y permitirlo solo para Windows. Aún no he probado en otras plataformas.

Lo que uso:
– Adoptium JDK 11
– Manjaro kernel 5.10.83-1-MANJARO de 64 bits
– KDE Plasma 5.23.4
– Qt 5.15.2

Ubicación detallada del bloqueo:

Clase Desktop:

public void browse(URI uri) throws IOException {
    checkAWTPermission();
    checkExec();
    checkActionSupport(Action.BROWSE);
    Objects.requireNonNull(uri);
    peer.browse(uri); // <--- aquí ocurre
}

El bloqueo ocurre en la clase XDesktopPeer que implementa la interfaz DesktopPeer (peer) en el método gnome_url_show(...):

private void launch(URI uri) throws IOException {
    byte[] uriByteArray = (uri.toString() + '\0').getBytes();
    boolean result = false;
    XToolkit.awtLock();
    try {
        if (!nativeLibraryLoaded) {
            throw new IOException("Failed to load native libraries.");
        }
        result = gnome_url_show(uriByteArray); // <--- bloqueo / aplicación no responde aquí
    } finally {
        XToolkit.awtUnlock();
    }
    if (!result) {
        throw new IOException("Failed to show URI:" + uri);
    }
}

Entonces… ¿el método Desktop#browse es compatible en la plataforma Linux solo para el escritorio Gnome?

Estoy suponiendo esto debido al nombre del método.

Si es así, ¿puedo realizar una verificación de bloqueo alrededor de mi código para evitar esto en mi aplicación, en lugar de verificar el sistema operativo y las distribuciones?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el método Desktop#browse solo es compatible en plataformas Linux para escritorios Gnome, como sugiere el nombre del método gnome_url_show en la clase XDesktopPeer.

    Para evitar bloqueos en su aplicación, puede intentar ejecutar el método Desktop#browse en un hilo separado o utilizar un SwingWorker para ejecutar el método en segundo plano. Esto evitará que el hilo principal sea bloqueado y mantendrá su aplicación receptiva. Además, puede capturar las excepciones InterruptedException e InvocationTargetException para manejar cualquier problema potencial con el hilo en segundo plano.

Comments are closed.