2012-01-12 14 views
11

Tengo un problema para ejecutar la aplicación Java en modo de pantalla completa en "openSUSE 11.4 (x86_64)". Estoy usando Java 1.6.0_26-b03.Java en pantalla completa en Linux: ¿cómo cubrir la barra de tareas?

He intentar ejecutar dos ejemplos de aplicación de pantalla completa:

  1. Ejemplo de Oracle sitio: Display Mode Test.
  2. JDarkRoom.jar (editor de texto simple) descargado de Codealchemists.

En ambos casos, tengo una barra de tareas de Linux visible sobre la aplicación. Debe ser algo con la configuración/configuración del sistema?

Respuesta

16

Usted debería ser capaz de ir a "pantalla realmente completa" con GraphicsDevice.setFullScreenWindow (window). Sin embargo, debido a errores en los tiempos de ejecución de Java más populares, esto puede no funcionar en sistemas que ejecutan ciertas versiones "rotas" en la serie 1.6 = Java 6. No lo he probado a fondo, por lo que es posible que el parche no se haya propagado a la población en general.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7057287

Antecedentes/Teoría

OK, así que aquí va a demasiada información, y no hay suficiente ayuda ... Aquí hay un poco de qué esto no funcionaba bien ...

No hay Linux Desktop

Los sistemas operativos basados ​​en Linux en máquinas de PC, así como en otros Unices (con una excepción parcial para MacOSX), normalmente usan el sistema X Window (también conocido como X11). En X, tiene un servidor X (generalmente, algo así como un "controlador de video") y clientes que se conectan a él, la mayoría de las veces, desde la misma máquina (loopback).

El diseño y la ubicación de las ventanas está controlado por un programa de cliente especial , llamado Administrador de ventanas. Es responsable de decorar las ventanas (por ejemplo, dibujar barras de título o cambiar el tamaño de las manijas) y colocarlas.

Su programa sería un cliente X. Puede solicitar - pero no demanda - colocación en la pantalla en una determinada posición o en un determinado tamaño. Varios administradores de ventanas son más (o menos) propensos a darte lo que deseas.

excepción, la mayoría de los escritorios juegan muy bien(a veces)

Ahora, por el momento, la mayoría de los escritorios Linux utilizan el escritorio Gnome, con un fuerte segundo lugar para el escritorio K, y algunos otros están en bastante amplio uso. Lo que es "bueno" es que estos dos entornos de escritorio (así como algunos otros, como XFCE para PC de gama baja) se ajustan a los estándares Window Manager Sugerencias.

(Super-over-simplification :) Normalmente, habrá paneles en uno o más bordes de la pantalla.Por lo general, solo hay uno, en la parte superior, pero hay muchas variaciones. Estas áreas del Panel no se consideran "parte de la pantalla", por lo que el Administrador de ventanas le dice a su aplicación, "no, eso está fuera del área en la que se le permite jugar; esta pantalla no es 1920 × 1080, es solo 1890 × 1080. "Por supuesto, esa podría ser una disposición totalmente diferente a la que habías previsto cuando escribiste tu aplicación, y podrías estar en mi netbook con una pantalla física de 800 × 480 pretendiendo ser solo 780 × 480.

Para el 99% de las aplicaciones, eso es genial. Windows no se interpone en el camino de los paneles, por lo que siempre puede acceder al panel en busca de controles críticos, como presionar Mute o cambiar a otro programa o algo.

Estos "consejos" le permiten solicitar que sus ventanas de nivel superior sean tratadas especialmente. Por ejemplo, puede solicitar que no obtenga una barra de título, o una barra de título de tipo "paleta" reducida; puede solicitar que se omita en la lista de ventanas o en la barra de tareas o en la descripción general de actividades o en cualquier otra interfaz que se pueda usar para mostrar las ventanas activas; o bien, puede solicitar que vaya al realmente a pantalla completa, e impulsar todo lo demás, incluso los paneles.

La especificación está aquí: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html

Y la Falla:

Básicamente, la especificación de los gestores de ventanas no estaban siguiendo correctamente por Sun/Oracle (o Red Hat, que copió fuera de Sun/Oracle, o probablemente IBM, porque probablemente hicieron lo mismo, pero no veo a nadie quejándose de ellos) ...

Aunque, veo algunas quejas sobre si es un error (específicamente) con el administrador de ventanas de K Desktop Environment (KWin), como aparentemente este error solo aparece en K, y no en Gnome, XFCE y sus amigos.

trabajo en torno

Aparte de remendar sus tiempos de ejecución de Java (y/o sus clientes), la única verdadera solución sería utilizar las bibliotecas de Java específicas de la plataforma (tal vez agarrar los objetos AWT subyacentes utilizando reflexión ... eww ...) y establecer los consejos de ventana adecuados, usted mismo.

Sí, eso es asqueroso ...

1

He usado ediciones de Oracle Java 1.6.0_31 y 1.6.0_26 usando el modo de pantalla completa . Experimenté algunos de los problemas con la ventana que no se muestra arriba de la barra de tareas en Ubuntu. Sin embargo, pude hacerlo funcionar con esta pequeña muestra de código.

// Create a window for full-screen mode; add a button to leave full-screen mode 
GraphicsDevice gs = GraphicsEnvironment.getLocalGraphicsEnvironment(). 
        getDefaultScreenDevice(); 
        //or initialize this for a specific display 
Frame frame = new Frame(gs.getDefaultConfiguration()); 
Window win = new Window(frame); 
Canvas c = new Canvas(); 
c.setBackground(Color.RED); 
win.add(c); 
win.show(); //or setVisible(true); 

// Enter full-screen mode 
gs.setFullScreenWindow(win); 
win.validate(); 

El truco que funcionó es hacer que la ventana sea visible primero, luego colocar la ventana en modo de pantalla completa. Configurar el modo de pantalla completa antes de que se muestre resultó en la barra de tareas sobre la ventana.

+0

Sería útil y más completo definir su objeto 'gs'. –

1

Ninguno de los anteriores funcionó para mí, estoy usando XUbuntu, ¡pero probé usando JWindow en lugar de JFrame y funcionó! Eso fue muy frustrante, espero que funcione para usted. Oh, debería mencionar que aún no he visto la API y no estoy realmente familiarizado con la clase JWindow, por lo que no estoy seguro de cuáles son las diferencias entre JWindow y JFrame. Buena suerte.

+0

¿Leyó la pregunta con cuidado? Esta no es la respuesta a eso, supongo. –

6

Me doy cuenta de que esta pregunta es un poco antigua, pero me encontré con que buscaba la misma respuesta.

Después de mucha experimentación, se me ocurrió una buena solución:

GraphicsDevice d = GraphicsEnvironment 
    .getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
if (d.isFullScreenSupported()) { 
    frame.setUndecorated(true); 
    frame.setResizable(false); 
    frame.addFocusListener(new FocusListener() { 

     @Override 
     public void focusGained(FocusEvent arg0) { 
      frame.setAlwaysOnTop(true); 
     } 

     @Override 
     public void focusLost(FocusEvent arg0) { 
      frame.setAlwaysOnTop(false); 
     } 
    }); 
    d.setFullScreenWindow(frame); 
} else { 
    frame.setVisible(true); 
} 

El oyente enfoque está por lo que el usuario puede ALT-TAB o META-D fuera de la ventana sin que inmediatamente forzando re- atención.

Esto funciona en mi sistema Linux Mint 15 con KDE 4. También estoy usando un servidor X de NVIDIA.

Espero que esto ayude! ¡Avíseme si les funciona a ustedes también!

5

Sólo una precisión del método de bgroenks:
Está bien el trabajo con Java7 y java8 en Ubuntu 14.10 (Unidad).

PERO: De lo contrario, debe establecer frame.setResizable(true);, no funcionará.

Tenga cuidado: el modo de pantalla completa solo funciona con JFrame (no JDialog o JWindow).

Aquí un ejemplo de código: Se lleva a cabo de setVisible(true)

/** 
* @param frame 
* @param doPack 
* @return device.isFullScreenSupported 
*/ 
static public boolean fullScreen(final JFrame frame, boolean doPack) { 

    GraphicsDevice device = frame.getGraphicsConfiguration().getDevice(); 
    boolean result = device.isFullScreenSupported(); 

    if (result) { 
     frame.setUndecorated(true); 
     frame.setResizable(true); 

     frame.addFocusListener(new FocusListener() { 

      @Override 
      public void focusGained(FocusEvent arg0) { 
       frame.setAlwaysOnTop(true); 
      } 

      @Override 
      public void focusLost(FocusEvent arg0) { 
       frame.setAlwaysOnTop(false); 
      } 
     }); 

     if (doPack) 
      frame.pack(); 

     device.setFullScreenWindow(frame); 
    } 
    else { 
     frame.setPreferredSize(frame.getGraphicsConfiguration().getBounds().getSize()); 

     if (doPack) 
      frame.pack(); 

     frame.setResizable(true); 

     frame.setExtendedState(Frame.MAXIMIZED_BOTH); 
     boolean successful = frame.getExtendedState() == Frame.MAXIMIZED_BOTH; 

     frame.setVisible(true); 

     if (!successful) 
      frame.setExtendedState(Frame.MAXIMIZED_BOTH); 
    } 
    return result; 
} 

Saludos, Stéphane.

+0

Pude hacerlo funcionar sin tener que 'setResizable (true)' y sin los oyentes de enfoque. El único problema que tuve fue cambiar el modo de visualización, que resolví usando 'DisplayMode.BIT_DEPTH_MULTI' y' DisplayMode.REFRESH_RATE_UNKNOWN'. Usando Kubuntu 15.10 con Java 8. – ray

+0

Muchas gracias, eres el rey. –

Cuestiones relacionadas