Professional Documents
Culture Documents
Contenido CAPÍTULO 12
2
Para un buen proyecto, siempre debe saber lo que estamos tratando de lograr
desde el principio. Debido a que este es más probable la primera aplicación
que utiliza la interfaz externa, vamos a seguir es relativamente sencillo en el
3
Para hacer la vida sencilla, habrá dos partes básicas para el programa: la
información en tiempo real, que es proporcionada por el navegador de VRML, y
la descripción gráfica de los contenidos de la escena, siempre en una ventana
aparte.
¿Por qué una ventana aparte? Quiero usar menús básicos para la escena de
fomento de la funcionalidad. Con pantallas pequeñas, que desea mostrar la
mayor cantidad de código y los gráficos como sea posible a la vez, por lo tanto,
con dos ventanas, no puedo poner el VRML en un lado y la interfaz de usuario
de Java en el otro, lo que permite máximo la pantalla de bienes raíces para el
VRML. (Otra ventaja de esto es que podemos avanzar muy rápidamente el
código Java para trabajar desde el navegador a través de un nodo de
secuencias de comandos en una fecha posterior.)
4
Funcionalidad
Cómo empezar
Hay mucho que hacer-, siempre es difícil decidir por dónde empezar. Podemos
comenzar con lo que va a aparecer en pantalla en primer lugar. Debido a que
están operando en un navegador Web, este punto de partida será una página
HTML.
HTML Esquema
<HEAD>
Generador <TITLE> VRML </ TITLE>
</ HEAD>
<! --
(c) Copyright Justin Sofá,
Virtual Light Company de 1996.
Código liberado bajo la licencia GNU Copyleft.
->
<BODY>
<embed SRC="basic.wrl" Width="100%" HEIGHT="500">
<applet>
CÓDIGO = "VrmlGenerator.class"
HEIGHT = "40" width = "100%"
MAYSCRIPT
>
<PARAM
name = "top_directory"
value = "c | / users / justin / libros / LNV / java / editor"
>
</ APPLET>
</ BODY>
</ HTML>
Puedes ver todos los elementos básicos en el Listado 12.1. Me han incorporado
la escena VRML ancho total y dado que una altura de 500 píxeles. El VRML
fuente archivo se llama basic.wrl. Debajo de que pongo en la etiqueta APPLET
habituales para incluir el código Java, con una altura de 40, porque sólo habrá
una sola fila de botones en la parte inferior. Una vez más, esta barra de
botones se extenderá todo el ancho de la pantalla.
NOTA: Estoy suponiendo que usted va a correr con una resolución de pantalla de al menos 800x600 y 16
bits de color. Usted necesita la presente resolución al ser capaces de adecuarse a toda la información y los
cuadros de diálogo en la pantalla. También estoy suponiendo que se está ejecutando este proyecto en un
sistema que puede manejar nombres de fichero largos.
Esquema de VRML
Así que aquí estamos tratando de escribir un generador de VRML, y tenemos que tener un
archivo VRML, incluso antes de empezar. Esto no tiene sentido! El motivo de esta captura-
22 se encuentra en lo profundo de la especificación de la clase de navegador.
Cuando llegamos a añadir un nodo que se han generado internamente, tenemos que tener
algunos padres de ese nodo. Por ejemplo, el createVrmlFromString () método devuelve un
conjunto de nodos. Para añadir estos nodos a la escena actual que necesita para pasar a la
del navegador de VRML. La única manera que usted puede hacer es añadir a los niños
como una pre-existente en el nodo de VRML escena actualmente visible. Poner
simplemente, tenemos que tener un nodo de agrupación como el nodo raíz en el mundo
VRML.
Ahora que sabemos que necesitamos un nodo de agrupación, es necesario que uno elija.
Para nuestros propósitos, este nodo sólo tiene que ser algo que podemos añadir y eliminar
nodos de. El Grupo de nodo es perfecto para este propósito.
Una vez que tenemos un nodo de la escena actual, tenemos que ser capaces de acceder a él
desde el applet. La única manera de hacerlo es dar el nodo DEF con un nombre y luego
recuperar una referencia a la misma con el getNode () método en el applet. No necesito
ningún procedimiento especial para ello, así que sólo lo llaman superusuario.
# El mundo de base
DEF raíz Grupo ()
Seguridad en Java
Seguridad de Java es un gran tema que hace la vida difícil para nosotros, ya que nos
gustaría ser capaces de escribir nuestros archivos en el disco.
firma digital, tenemos que buscar algún otro trabajo de Alternativas a la restricciones de
seguridad en Java applets.
El método más fácil de la creación de un applet de confianza que por lo general se trabaja
para incluir el código en un directorio que está en su CLASSPATH. Puede colocar el código
en un directorio ya existente o añadir un nuevo directorio en su CLASSPATH. Usted tendrá
que configurar el parámetro para source_directory el applet a este mismo directorio (ver la
sección anterior para obtener más información sobre el directorio de fuentes).
Java 1.1 y Netscape 4.0 se incluyen otras opciones para permitir el acceso a los applets de
la unidad de disco duro. Otras alternativas son el lugar para el applet de java en el directorio
de Netscape, o incluso en el directorio donde se encuentran las clases java .*.
Algunos navegadores web son muy cerrados de mente acerca de que permite el acceso a las
unidades locales, incluso a un applet de confianza. Por esta razón, he incluido una ventana
adicional que se mostrará el archivo de texto. Como primera solución, el código Java se
escribirá en esta ventana, usted tendrá la opción de tratar de escribir a su unidad local. Si la
escritura falla, siempre puedes hacer el viejo de cortar y pegar truco en su editor de texto
favorito.
Nota: No olvide guardar el archivo como texto plano, no como unicode o cualquier otro formato.
Sin embargo, debido a VRML 2.0 y la interfaz externa son tan nuevas, todo el código que
se ha desarrollado desde cero, haciendo de esta una muy interesante reto. Todas las
estructuras de datos internas y la mayor parte de la interfaz de usuario se han desarrollado
por mí y un amigo, Cameron Gillies.
Quería mostrar una estructura de árbol de la escena gráfica que indica los nodos y cómo
encajan juntos. (Recuerde que estoy tratando de crear una interfaz de usuario similar a la V-
IDS Reino constructor.) Usé un widget de árbol de Thomas Koch (Koch
http://orgwis.gmd.de/ ~ / Java / Applets / TreeTool /) como el punto de partida. Sólo se
ofrece etiquetas de texto, pero la estructura general está ahí. Hemos mejorado
significativamente este paquete básico para añadir imágenes y texto, así como muchas otras
pequeñas mejoras.
8
Código de estructura
Este proyecto va a ser una tarea bastante compleja pieza de código, por lo que debemos
asegurarnos de que tenemos una buena estructura del código para evitar que un lío de cosas.
Hay tres partes principales del código: el código de inicio de aplicación, la interfaz de
usuario (IU), y el almacenamiento de datos interno. Vamos a colocar cada parte en paquetes
separados y tener un directorio de todas las imágenes.
El código de inicio inicializa todas las estructuras de datos y las interfaces de usuario. He
creado dos ventanas principales, además de la barra de botones en el applet. Una ventana es
el editor, y el otro es para el código de salida y es mucho más simple que el editor.
Código de inicio se mantiene en el directorio de nivel superior, en el mismo lugar que los
archivos HTML y VRML. Usted puede cambiar esta ubicación por tener una diferente
CODEBASE se especifica en la etiqueta APPLET. Las excepciones que podría generar el
código se mantienen en el conjunto de excepciones en virtud de este directorio de nivel
superior.
Interfaz de usuario
Creación de la interfaz de usuario (IU) en el código de este proyecto tiene la mayoría de los
esfuerzos y se puede subdividir en varias categorías, incluida la principal ventana del editor,
de un millón de cuadros de diálogo de diversas acciones, y un paquete separado para
mostrar el árbol en el editor . El árbol es una pieza bastante compleja de código en su
propio derecho, por lo que se mantiene en un paquete separado.
He cumplido con cada uno de diálogo y ventanas de su propia clase y creó una
sola instancia de cada clase al comienzo para que pueda ocultar y mostrar que
cuando se requiera. Yo prefiero este enfoque más dinámica la generación de
nuevos casos cada vez que quiera editar algo, porque es mucho más rápido
(especialmente cuando se ejecuta código Java interpretarse). Además de esa
ventaja, este enfoque también significa que sólo puede tener una copia de
cada cuadro de diálogo en la pantalla a la vez, por lo tanto, el ahorro de
confusión por parte del usuario. Otra buena razón para hacerlo de esta manera
es que la mayoría de los sistemas operativos tienen límites duros sobre el
número de ventanas abiertas, si están en constante creación de nuevos
cuadros de diálogo, es posible agotar los recursos del sistema, mientras que
todavía hay bastante memoria izquierda. Y si hay mucho de memoria, la
recolección de basura no liberar los recursos para usted. Así que la mejor
práctica es mantener a uno y sólo uno de cada uno alrededor.
Nota: A diferencia de VRML 1.0, nodo pedido no es normalmente importante en VRML 2.0.
Todo lo que necesita para asegurarse de que cada nodo tiene la DEF declaró en el expediente
antes de que se utilice.
Por último, está el menú de nodo, lo que crea un nuevo nodo del tipo
seleccionado. Tengo los nodos agrupados en grupos más o menos la misma
que se utilizan en la especificación de VRML (aunque esto sería muy sencillo
para ti a cambio), pero más ordenado a lo largo de líneas funcionales. Por
ejemplo, poner la forma de nodo en la parte superior de la geometría de menú,
ya que será necesario muy a menudo y se utiliza siempre en combinación con
la geometría de los nodos.
puede encontrar en el CD-ROM. Una cosa para notar es que cada menú tiene
una variable global, como se explicará en una sección posterior.
Si tuviera que incluir el editor en la principal página HTML, que dejaría muy
poco espacio para nada más. Con esto en mente, he utilizado un marco como
la clase base para la clase EditWindow. El constructor se utiliza para configurar
la ventana de diseño básico y se muestra es Listado de 12.3.
/ / Generador de VRML
/ / (C), Justin Sofá
/ /
/ / Desde el capítulo 12: Late Night VRML 2.0 y Java
/ /
/ / El contenedor de la ventana que tiene la ventana de edición
ui paquete;
ui.ImageButton de importación;
ui.VrmlTree de importación;
importación ui.dialogs .*;
Codebase = code_base;
/ / Crear el menú
createMenu ();
También puede ver que debo hacer para establecer un tamaño fijo de la
ventana aquí. Esto podría ser fácilmente modificado para establecer el tamaño
sobre la base de las etiquetas PARAM en el archivo HTML, si es necesario.
Code_base la cadena pasada al constructor nos permite ubicar dónde nos
encontramos en el disco duro y poner en la ruta correcta de las imágenes.
Por último, se puede ver un ejemplo de cada uno de los dos cuadros de diálogo
en la parte inferior de la constructora. Estos están ahí para que yo puedo
llamar al método show en ellos cada vez que desee hasta el pop, que es mucho
más rápido que tener que crear nuevas instancias cada vez que quiero usar
una.
Me gusta trabajar con los botones de acceso directo a las solicitudes. Para
hacer mi vida más fácil, he decidido añadir un acceso directo a la barra para el
editor de nodos más comunes.
return true;
Las dos llamadas a los métodos processMenu y processButton lidiar con sus
respectivos aportes. ProcessButton es muy simple: Hay sólo 14 opciones para
los botones, por lo que construir un gran si-otra escalera para hacer frente a
todas las posibilidades.
Nota: Es posible que haya notado que, para salvar los dos temas que estoy haciendo nada,
salvo que muestra el cuadro de diálogo de advertencia. Como he mencionado antes, la escritura
en un archivo de salida no se incluye en la limitación de la funcionalidad de este sistema.
15
if (padre == file_menu)
{
if ( "Nuevo". iguala (arg))
{
screen_data.deleteAll ();
vrml_data.deleteAll ();
}
else if ( "Guardar". iguala (arg))
warn.show ();
else if ( "Guardar como". iguala (arg))
warn.show ();
else if ( "Cerrar". iguala (arg))
this.hide ();
}
else if (padre == edit_menu)
processEditMenu (e, arg);
algo más
processNodeMenu (e, arg, padre);
}
Ya que había muy poco que ver en el menú Archivo, me han tratado esta línea
en lugar de crear un nuevo método.
El Árbol de la pantalla
Ahora que hemos construido todos los periféricos, podemos pasar a la parte
principal del programa: la pantalla gráfica del archivo VRML. En su propio
derecho, esta es la parte más compleja del editor, y que obtiene su propio
paquete-ui.tree.
Si esto es todo lo que era, las cosas serían muy simples. El problema al que nos
enfrentamos es entonces, ¿cómo asociar a lo que se visualiza en la pantalla a
nuestro interior la estructura de datos?
/ / Generador de VRML
/ / (C) 1996 Justin Sofá
/ /
/ / Desde el capítulo 12 Late Night VRML 2.0 y Java
/ /
/ / Subclassed versión de TreeNode que también mantiene el puntero
/ / A la estructura interna y VRML. Esto es así cuando el
/ / Objeto está seleccionado también sabe dónde insertar el
/ / Objeto en la escena gráfica.
ui.tree paquete;
ui.tree.TreeNode de importación;
geometry.VrmlObject de importación;
Cadena de título,
OpenFolder cadena,
Cadena ClosedFolder)
{
super (título, OpenFolder, ClosedFolder);
vrmlNode = nodo;
}
18
Añadiendo a la escena
if (screen_data.selected == null)
{
select_warn.show ();
retorno;
}
19
Así que ahora sabemos que tenemos un nodo padre, y también sabemos qué
tipo de nodo está a punto de ser añadido. Lo único que queda es dibujar en la
pantalla y añadir a la estructura de datos interna, ¿no? Bueno, de tipo.
Leyendo.
Comprobación de la coherencia
La clase VrmlType
La clase consiste VrmlType puramente como una lista de los tipos de nodo de
VRML. Cada nodo se representa como una final entero. Siempre que un tipo de
nodo que se pasa entre los métodos, se usa un número, y esta clase es para
ser utilizado como la interpretación de ese número entero.
Antes de solicitar al usuario definir los detalles del pedido nodo, tenemos que
pasar por una prueba más. Esta vez se trata de mantener la correcta sintaxis
de VRML, por lo que necesitamos para determinar el nodo padre a la que
estamos añadiendo el nuevo nodo.
Digamos que desea añadir una casilla a la escena. Para comprobar que el
padre es una forma de nodo, que se utiliza el siguiente código:
retorno;
}
Demasiados niños?
agradable. Tenemos que darles al menos una oportunidad para modificar las
cosas.
Hacer la vida más fácil para nosotros por la reutilización de código es uno de
los objetivos de la programación orientada a objetos. Podemos construir una
sola clase base y luego cada uno se derivan sobre la base de ese diálogo.
Podemos ir un paso más que esto: La clase base proporcionará toda la
funcionalidad que necesitamos en términos de los botones y pantalla de
gestión básica, por lo que todos tenemos que hacer para cada nodo es facilitar
la etiquetas y campos de texto para reunir la información.
if (screen_data.selected == null)
{
select_warn.show ();
retorno;
}
Así que ahora sabemos que tenemos un nodo padre, y también sabemos qué
tipo de nodo está a punto de ser añadido. Lo único que queda es dibujar en la
pantalla y añadir a la estructura de datos interna, ¿no? Bueno, de tipo.
Leyendo.
22
Comprobación de la coherencia
La clase VrmlType
La clase consiste VrmlType puramente como una lista de los tipos de nodo de
VRML. Cada nodo se representa como una final entero. Siempre que un tipo de
nodo que se pasa entre los métodos, se usa un número, y esta clase es para
ser utilizado como la interpretación de ese número entero.
Antes de solicitar al usuario definir los detalles del pedido nodo, tenemos que
pasar por una prueba más. Esta vez se trata de mantener la correcta sintaxis
de VRML, por lo que necesitamos para determinar el nodo padre a la que
estamos añadiendo el nuevo nodo.
Digamos que desea añadir una casilla a la escena. Para comprobar que el
padre es una forma de nodo, que se utiliza el siguiente código:
{
gen_warn.show ( "Usted necesita una forma para la" +
"padre de la geometría nodos");
retorno;
}
Hacer la vida más fácil para nosotros por la reutilización de código es uno de
los objetivos de la programación orientada a objetos. Podemos construir una
sola clase base y luego cada uno se derivan sobre la base de ese diálogo.
Podemos ir un paso más que esto: La clase base proporcionará toda la
funcionalidad que necesitamos en términos de los botones y pantalla de
gestión básica, por lo que todos tenemos que hacer para cada nodo es facilitar
la etiquetas y campos de texto para reunir la información.
Listado de 12,7 VrmlBaseDialog-la clase base de todos los diálogos que tratan
de Entrada de usuario de VRML-Información Relacionada
/ / Generador de VRML
/ / (C), Justin Sofá
/ /
/ / Desde el capítulo 12: Late Night VRML 2.0 y Java
/ /
/ / El contenedor de diálogo para editar las propiedades de cada nodo
/ / Esto debería subclassed para producir el diálogo
ui.dialogs paquete;
PRECAUCIÓN: Hay una serie de lugares en el listado 12.7 y 12.8 que se refieren a la
aprobación de alrededor de los casos el navegador de VRML. Esta es una kludge para evitar una
serie de problemas con los principios de los navegadores de VRML no aplicación de la
especificación correcta de EAI. En el momento de la escritura, la EAI es algo todavía en un estado
de flujo. Es probable que el código incluido en el CD-ROM puede ser diferente (y más precisa)
que lo que se muestra aquí, y el código en mi sitio web será diferente de nuevo. Para la última
versión que funciona con los navegadores de VRML más reciente, consulte
http://www.vlc.com.au/VermelGen/.
Comenzando con el último punto en primer lugar: Cada nodo que puede
colocar en la escena puede tener un nombre asociado a él por la palabra clave
DEF, como se explicó en el Capítulo 1. Este campo de texto es común en todos
los nodos y, por tanto, pertenece a la base de la aplicación.
Los botones están todos declarados y gestionados de la clase base, pero las
necesidades de la funcionalidad que se incluirá en las clases derivadas. ¿Cómo
podemos solucionar este problema? En Java, podemos crear un método
27
abstracto y luego llamar a ese método. Esto nos da lo mejor de ambos mundos:
El compilador sabe que existe el método en tiempo de compilación, y usted
tiene la función personalizada en cada clase derivada que se llama
correctamente.
Figura 12.2 La Esfera cuadro de diálogo resultante del código de los anuncios
en 12.7 y 12.8
/ / Generador de VRML
/ / (C), Justin Sofá
/ /
/ / Desde el capítulo 12: Late Night VRML 2.0 y Java
/ /
/ / El Grupo de diálogo nodo. Sólo tiene que obtener el tamaño de caja
/ / Y centro, así como un nombre DEF.
ui.dialogs paquete;
exceptions.NoSelectedNodeException de importación;
vrml_data = datos;
screen_data = árbol;
if (str.equals (""))
sphere.name = null;
29
intentar
{
vrml_data.addNode (VrmlTypes.Sphere, esfera);
}
de capturas (NoSelectedNodeException e)
{
System.out.println ( "No nodo seleccionado");
}
return false;
}
}
Como se puede ver en la Figura 12.2, con sólo cuatro líneas de código en el
constructor que ahora tenemos un cuadro de diálogo de trabajo. Obviamente,
la otra, más compleja nodos tendrá mucho más líneas de código para crear.
Echa un vistazo en el cuadro de diálogo para la transformación de nodo-
TransformDialog.java-como un complejo ejemplo.
Crear el Nodo
Ahora que estamos llegando al final del proyecto, finalmente llegar a crear ese
nodo. Mirar hacia atrás a la applyInformation método en el Listado 12.8.
Recuerde que este es el método abstracto de la VrmlBaseDialog en el Listado
12.7. Una serie de acciones se llevan a cabo cuando se decide a golpear bien el
botón Aceptar o Aplicar.
Una vez que tengamos los valores de campo, comprobamos que la versión del
nodo que vamos a construir y crear adecuadamente. Después de que el nodo
de base se construye, se rellena el campo del nombre. Si el campo está vacío,
nos ponemos el nombre a null; de lo contrario, asigne una nueva cadena para
30
ello. Hay un error aquí: Si la cadena contiene un blanco, como un espacio o una
ficha y, a continuación, se reproduce este personaje como una cadena, lo que
causa problemas más adelante. Una manera simple de esto es la subclase AWT
de texto y realizar un seguimiento de la clave de entrada, en sustitución de
caracteres como usted va.
NOTA: La razón de las múltiples constructores para cada tipo de nodo se trata en el Capítulo
23, cuando miro en el VRML de datos.
Ordenar
Qué! Hay más ...? Después de haber ido a todos los problemas de este control
y que esta y la producción de cuadros de diálogo y hacer aportaciones y que
piensas ... Voy a pie y realmente no se molesta en agregar el nodo a la escena?
Para cada tipo de nodo, tenemos que emitir el padre (que todavía se conserva
como una VrmlObject) para el tipo correcto y, a continuación, llamar al método
apropiado para ese tipo de niños. Volver a la Forma nodo (de nuevo): Para
agregar un cuadro de ella, escribimos las siguientes líneas de código:
Yo al igual que dar un paso atrás para un segundo y examinar lo que acabamos
de hacer. En las últimas páginas, hemos creado un nodo y, a continuación, se
añade a la escena, sin explicar realmente lo que está ocurriendo internamente.
Para entender lo que está ocurriendo, tenemos que mirar en el código que
31
Para hacer visible el nodo, tenemos que decirle al navegador de VRML para
añadirlo pulg Ahora, piensa en el caso de VRML sistema, la única manera que
usted puede hacer es pasar de un evento a otro nodo que contiene una
referencia a la nodo que desee agregar. El problema es que el applet existe
fuera del entorno del navegador, mientras que el nodo de destino existe dentro
de él.
Sin entrar en detalles farragosos, la ventana es un marco con una simple barra
de menú (dos puntos: guardar y cerrar) y un texto como el cuerpo de la
ventana.
Listado de 12,9 indica que no hay mucho que puede hacer en el constructor.
Sólo tienes que configurar la barra de menús y, a continuación, el contenido de
32
ui paquete;
OutputWindow público ()
{
/ / Crear de diálogo de advertencia
advertir = new NotImpDialog (este);
menu_bar.add (file_menu);
setMenuBar (menu_bar);
Observe que, para que el texto que se mostrará, debe ir a través de un método
de llamada. La otra opción-dejar el texto como una variable pública y dejar que
llamar a su método setText directamente era demasiado de un riesgo. Código
puede ser escrito por un usuario desinformado que modifica otras propiedades,
que no quería que esto ocurra.
La clase abstracta VrmlObject, que forma la base de todas las clases de VRML,
define un método llamado WriteToFile:
PrintStream, pero nuestra clase de ventana quiere editar una cadena. ¿Cómo
solucionar este problema? La solución reside en el paquete java.io. Este
paquete es útil para todo tipo de cosas, y vale la pena saber lo de adentro
hacia fuera.
"En caso de duda, siempre a su vez de una variable en una matriz de bytes y, a
continuación, volver a interpretar los datos" es un buen lema que C / C
programadores han utilizado desde el principio. No hay diferencia aquí. La
solución a un PrintStream convertir en una cadena es el primero en escribir
todo a una matriz de bytes.
Borrado de nodos
supresión requiere muy poco trabajo. Puede utilizar esto como una directriz
para la aplicación de sus propias extensiones a este código básico.
Eso es todo lo que hay es demasiado. Me tomó alrededor de una hora y media
para ir a través de todo el código y hacer los cambios para agregar este pulg
Usted puede encontrar el código completo de este proyecto en el CD-ROM y un
ejemplo del resultado final en la Figura 12.3.
36
Ahora que tenemos esta gloriosa nuevo editor de VRML 2.0, tenemos que
aprender a conducirlo. Afortunadamente, no hay mucho que aprender.
Después de la espera de editor para empezar, sólo hay una cosa que puedes
hacer: Añadir un nodo a la escena. Si usted va directamente a la barra de
accesos directos y seleccione un nodo, es probable que se muestre el cuadro
de diálogo de advertencia que dice que usted necesita para seleccionar un
nodo en primer lugar. Haga clic en la raíz del mundo (el nodo etiquetado
Unknown.wrl). Ahora trate de añadir un nodo.
Incluso con esta base de la mayoría de los editores, debería ser capaz de
generar algunos modelos realmente agradable. Cuando esté satisfecho, pulse
el botón Escribir salida, y el código se mostrará. A continuación, puede cortar y
pegar en un editor de texto y trabajar en él a partir de ahí.
¿Qué es la izquierda?