Java - Full Screen

7
Aplicaciones a pantalla completa Fecha de creación: 08.04.2003 Revisión 1.0 (08.04.2003) Antonio Calero (acalero AT iti DOT upv DOT es) http://www.javaHispano.org Copyright (c) 2003, Antonio Calero. Este documento puede ser distribuido solo bajo los términos y condiciones de la licencia de Documentación de javaHispano v1.0 o posterior (la última versión se encuentra en http://www.javahispano.org/licencias/).

Transcript of Java - Full Screen

Page 1: Java - Full Screen

Aplicaciones a pantalla completaFecha de creación: 08.04.2003

Revisión 1.0 (08.04.2003)

Antonio Calero (acalero AT iti DOT upv DOT es)

http://www.javaHispano.org

Copyright (c) 2003, Antonio Calero. Este documento puede ser distribuido solo bajo los términos ycondiciones de la licencia de Documentación de javaHispano v1.0 o posterior (la última versión se

encuentra en http://www.javahispano.org/licencias/).

Page 2: Java - Full Screen

Aplicaciones a pantalla completa

El propósito del siguiente artículo es introducir los conceptos básicosnecesarios para desarrollar cualquier tipo de aplicación en Java utilizando elmodo Full-Screen (pantalla completa) disponible a partir de la versión 1.4 delJDK de SUN. La mayoría de aplicaciones que utilizan este modo son losvideojuegos, pero eso no implica que no se pueda utilizar en aplicaciones deámbito general.

Para comprender el funcionamiento de este modo de pantalla veremos unejemplo sencillo, el típico "Hola Mundo", pero en este caso utilizando unaaplicación a pantalla completa. Una vez visto el ejemplo el paso de cualquiertipo de aplicación en Swing o AWT a pantalla completa es inmediato.

Este artículo está destinado tanto a usuarios noveles de Java como ausuarios avanzados. Espero que sea de gran ayuda tanto para unos como paraotros.

MODO EXCLUSIVO A PANTALLA COMPLETA

A muchos programadores que hayan utilizado la API de Microsoft Direct X esteconcepto les resultará bastante familiar, para otros programadores quizás este conceptoles sea totalmente nuevo. De una o de otra forma hay que decir que el modo exclusivo apantalla completa es una potente característica del J2SE a partir de su versión 1.4 quepermite al programador suspender el entorno de ventanas del sistema operativo para queel dibujado pueda ser aplicado directamente en la pantalla. Esto puede sonar un pococonfuso pero veremos exactamente a que nos referimos a continuación.

En las aplicaciones Java con las interfaces gráficas tradicionales, AWT es elresponsable de propagar los eventos de "pintar" del sistema operativo, a través del un hilomanejador de eventos, e invocando el método Component.paint de AWT siempre que seanecesario (redibujado de pantalla, al pasar el ratón por encima, etc.). Pues bien, en elmodo exclusivo a pantalla completa, el dibujado se puede hacer activamente a través dela propia aplicación. Esto permite reducir gran cantidad de recursos que eran consumidospor el hilo de AWT, y que normalmente no son necesarios en este tipo de aplicacionescomo puede ser un videojuego.

Utilizar este modo a pantalla completa en las interfaces gráficas tradicionales implicaque se tendrá que limitar a la profundidad de color y al tamaño de pantalla que elija elusuario. Esto puede ser controlado por el programador a través de la clase DisplayMode,más adelante veremos como podemos utilizar esta clase para establecer el modo depantalla que nosotros queramos.

Finalmente, muchas otras técnicas avanzadas, como por ejemplo page-flipping (que setratará con profundidad en posteriores artículos) o visores estereoscópicos (sistemas queutilizan conjuntos separados de imágenes para cada ojo) requieren, en algunasplataformas, que una aplicación este principalmente en modo exclusivo a pantallacompleta.

java.awt.GraphicsDevice

Aplicaciones a pantalla completa

Página 2

Page 3: Java - Full Screen

La gestión del modo exclusivo a pantalla completa de Java se hace a través de unobjeto de la clase GraphicsDevice. Para obtener una lista de todos los dispositivos depantalla (en sistemas multi-monitor puede que tengamos más de un dispositivo) se puedeinvocar el método getScreenDevices de la clase java.awt.GraphicsEnvironment (querepresenta a nuestro entorno gráfico de ventanas). Para el dispositivo primario por defectose puede invocar directamente el método getDefaultScreenDevice.

Entonces lo primero que tenemos que hacer si queremos usar el modo a pantallacompleta es obtener esa referencia al dispositivo gráfico que representará a nuestromonitor. Esto lo hacemos en nuestro código de la siguiente manera:

...

// Obtenemos la referencia al entorno de ventanasGraphicsEnvironment ge =GraphicsEnvironment.getLocalGraphicsEnvironment();

// Obtenemos el dispositivo gráfico primario (por defecto)GraphicsDevice gd = ge.getDefaultScreenDevice();

...

Una vez obtenida la referencia al dispositivo gráfico podremos invocar alguno de losmétodos siguientes:

public boolean isFullScreenSupported()

Este método devuelve verdadero si el modo exclusivo a pantalla completa estádisponible, es decir, si el hardware y el sistema operativo de la máquina tienen soportepara utilizarlo. En sistemas donde el modo exclusivo no esté disponible probablementesea mejor ejecutar la aplicación en una ventana de tamaño fijo y predefinido queestablecer una ventana a pantalla completa.

public void setFullScreenWindow(Window w)

Este método entra en el modo exclusivo a pantalla completa utilizando la ventana quese le pase como argumento. Si el modo exclusivo no esta disponible, la ventana seposiciona en el punto (0, 0) y se redimensiona hasta ajustarse completamente a lapantalla. Si utilizamos este método con un argumento nulo saldremos del modo exclusivoa pantalla completa.

Básicamente esto es todo lo que se necesita saber para empezar a utilizar el modo apantalla completa (sencillo, ¿verdad?). Veamos un primer ejemplo con una clase muybásica, esto nos hará descubrir que aún es necesario algún que otro concepto...

HolaMundo.java

Vamos a ir comentando en detalle todo aquello que nos vayamos encontrando en elcódigo de la clase:

Aplicaciones a pantalla completa

Página 3

Page 4: Java - Full Screen

// AWT-SWINGimport java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;

// DEFINICIÓN DE LA CLASEpublic class HolaMundo extends JFrame {

Podemos ver que en primer lugar estamos importando los paquetes básicos de AWT ySwing por si se quisieran añadir botones, paneles, escuchadores de eventos, etc. Sepresupone un mínimo conocimiento de Java con lo que supongo que estas primeraslíneas todo el mundo las entenderá.

El primer dato importante a tener en cuenta está en la declaración de la clase, comopodéis ver, la clase extiende de JFrame. Esto es obvio puesto que estamosimplementando una interfaz gráfica y por tanto debemos hacer que nuestra clase heredede Window. En este caso eso se consigue heredando de JFrame, pero también podríamoshaber heredado directamente de la clase Window, o también de la clase Frame. Cada unopuede tener una manera concreta de programar sus interfaces, así que aquí que cadauno herede de lo que cree oportuno, siempre que todo herede de la clase Window no habráproblema.

// ATRIBUTOS DE LA CLASE

// Referencia al dispositivo gráficoprivate GraphicsDevice gd = null;

Definiremos un atributo de la clase con la referencia al dispositivo gráfico primario delsistema, que es en definitiva la que nos dará acceso al modo exclusivo a pantallacompleta.

Continuemos viendo el código del constructor:

public HolaMundo() {

// Primero obtenemos una referencia al entorno gráfico de ventanasGraphicsEnvironment ge =

GraphicsEnvironment.getLocalGraphicsEnvironment();

// Obtenemos una referencia al dispositivo gráfico primariogd = ge.getDefaultScreenDevice();

// Si no hay soporte adecuado lo mostramos por pantallaif(!gd.isFullScreenSupported())System.out.println("WARNING: No hay soporte.\n");elseSystem.out.println("INFO: Detectado soporte\n");

try {

Aplicaciones a pantalla completa

Página 4

Page 5: Java - Full Screen

// Activamos el modo a pantalla completagd.setFullScreenWindow(this);

// Inicializamos toda la interfaz gráficainitMainInterface();}catch(Throwable e) {e.printStackTrace();System.out.println("ERROR CRITICO: "+e.getMessage());exit();}

}//constructor

Bien, pues tal y como se comentó al principio obtenemos la referencia al entorno deventanas y a partir de ella el dispositivo primario de gráficos. Una vez lo tenemospodemos comprobar si nuestro sistema tiene soporte para utilizar el modo exclusivo (noimporta si no tiene, puesto que en ese caso se ejecutará en una ventana de tamaño laresolución actual del sistema). A continuación estableceremos el modo a pantallacompleta e inicializaremos la interfaz gráfica con todos los elementos que queramos. Noes tema de este artículo tratar las excepciones, además supongo que son de sobraconocidas por los que lean el artículo, basta decir que se captura cualquier excepción quese pueda generar y que se muestra la traza y se termina la aplicación invocando almétodo exit().

Veamos el código de los métodos nuevos que aparecen aquí, initMainInterface() yexit()

public void initMainInterface() throws Exception {

// WindowListener para cerrar la aplicación al cerrar la ventanathis.addWindowListener(new java.awt.event.WindowAdapter() {public void windowClosing(WindowEvent e) {exit();

}});

// Aqui añadimos una etiqueta en la "ventana" con la cadena HolaMundothis.getContentPane().add(new JLabel("HOLA MUNDO!"));

this.setVisible(true);

}//initMainInterface

Este código no os debe parecer extraño si alguna vez habéis hecho alguna ventana conJava. En primer lugar establecemos un escuchador de eventos para cuando se cierre laventana de la aplicación, en cuyo caso invocaremos el método exit. Después añadimosuna etiqueta a nuestra ventana, y la hacemos visible.

Aplicaciones a pantalla completa

Página 5

Page 6: Java - Full Screen

Cómo podéis ver el código no cambia en absoluto al realizar la aplicación a pantallacompleta (al menos no de momento y para las aplicaciones "normales"). Podríamosañadir cualquier tipo de componente que nos ofrece AWT o Swing y utilizarla en nuestraaplicación a pantalla completa sin ningún problema.

Por último veamos el código para salir de la aplicación:

public void exit() {

// salimos del modo a pantalla completagd.setFullScreenWindow(null);

// salimos de la aplicaciónSystem.exit(0);

}//exit

Basta con salir del modo a pantalla completa (es necesario para no dejar el modoexclusivo más tiempo del que se debiera) y hacer un System.exit().

Conclusión

Pues con esto ya tenemos nuestra primera aplicación que utiliza el modo exclusivo apantalla completa en Java. Es bastante sencillo, sin embargo, cuando probéis a ejecutarla aplicación os surgirán preguntas y comentarios como: "Muy bonito, ¿pero cómoespecifico la resolución que yo quiera a pantalla completa?" "¿Cuáles son las mejoras queobtengo al hacer mi aplicación de esta manera?" "No da la impresión de que este en unmodo a pantalla completa. Esto no creo que sirva de mucho." "El aspecto sigue siendo elmismo" "¿Con esto pretendes que haga un juego? Pues vaya...".

Tranquilos, este primer tutorial es muy básico y tampoco quería profundizar demasiado.Sólo quería mostrar la sencillez de Java para trabajar a pantalla completa (siempre que elsistema tenga soporte, claro). Este artículo pretende ser una pequeña introducción altema y nada más. Puede que esta información a alguien ya le resulte suficiente paradesarrollar alguna aplicación que necesite estar en "primer plano" por así decirlo (sin quese vea la barra de tareas de Windows o de Linux, o cosas así).

Recursos y referencias[1] Código HolaMundo.java, http://www.javahispano.org/download/ejemplos/pantalla_completa.zipCódigo

HolaMundo.java

Acerca del autor

Antonio Calero es Ingeniero en Informática y trabaja en el Instituto Tecnológico deInformática de la Universidad Politécnica de Valencia en el grupo de SistemasDistribuidos. Es un apasionado de la programación de videojuegos y a ellos intentadedicar su poco tiempo libre, su mayor sueño sería terminar el juego de rol queactualmente está desarrollando en Java con un grupo de amigos.

Aplicaciones a pantalla completa

Página 6

Page 7: Java - Full Screen

Copyright (c) 2003, Antonio Calero. Este documento puede ser distribuido solo bajo los términos ycondiciones de la licencia de Documentación de javaHispano v1.0 o posterior (la última versión se

encuentra en http://www.javahispano.org/licencias/).

Aplicaciones a pantalla completa

Página 7