NetBeans 6.8 y Visual Library API, ejemplo completo

domingo, 13 de diciembre de 2009
Hace unos días me vi enfrentado en la necesidad de desarrollar una aplicación que permitiera crear diagramas arrastrando iconos desde una paleta. Para esto existen varias bibliotecas de la API de NetBeans que son muy útiles, las cuales permiten desarrollar una aplicación del tipo "Editor visual", como Microsoft Visio o Dia, con el cual podemos generar diagramas y agregar acciones.

Muchos pequeños ejemplos para trabajar con la Visual Library API se pueden encontrar en http://netbeans.sourcearchive.com/documentation/6.0.1/files.html.

También existe este ejemplo en http://java.dzone.com/news/how-create-visual-applications el cual nos indica como agregar un poco de funcionalidad a un widget y este otro ejemplo en http://java.dzone.com/news/how-add-resize-functionality-v que nos dice como agregar la funcionalidad de "Resize" de un widget, el cual modifiqué un poco.

Otro ejemplo muy bueno es éste de acá, que nos muestra como añadir la Common Palette a nuestra aplicación, funcionalidad que se utilizó en este ejemplo.

Primero que todo quiero agradecer la buena voluntad de Geertjan Wielenga y David Kaspar, quienes muy amablemente me ayudaron a entender como funcionan algunas API de NetBeans y con lo cual pude desarrollar un ejemplo que quiero compartir con ustedes.

Lo primero es aclarar que el ejemplo hace uso de la plataforma NetBeans, tanto para su desarrollo como para su ejecución. NetBeans trae la opción de crear una aplicación utilizando un esqueleto llamado NetBeans Platform Application


al cual, en este ejemplo se le dio el nombre de Visual Editor.



Sobre este esqueleto se agregan módulos.


y los módulos se pueden crear como aplicaciones standalone (para cargar en NetBeans IDE) o como módulos para una aplicación del tipo NetBeans Platform Application, el cual es nuestro caso.


La gracia de crear módulos en NetBeans es que pueden ser exportados como archivos nbm, los cuales pueden ser cargados dentro de NetBeans o nuestras aplicaciones del tipo NetBeans Platform Application.

Al crear una aplicación del tipo NetBeans Platform Application, le podemos cargar todos los módulos que queramos lo cual nos permite crear una aplicación extensible y además nos permite exportar la aplicación con binarios listos para su ejecución (script en linux, exe en windows).

Dejo aquí el enlace de descarga del código fuente del ejemplo, el cual iremos comentando a continuación y acá están los binarios.

Para crear una aplicación del tipo editor de diagramas, debemos crear una escena. Una escena es un componente que permite agregar widgets en él y se encarga de manejarlos por nosotros.

En el caso de este ejemplo, creamos una clase llamada MyScene que hereda de la clase GraphScene.

public class MyScene extends GraphScene<MyNode, MyEdge> {

En una escena tenemos Nodos y Edges. Ambos son widgets pero la diferencia es que los Nodos los utilizamos para los iconos representativos que agregamos a la escena y los Edges los utilizamos para crear conexiones entre los nodos, es por eso que creamos las clases MyNode y MyEdge.

Cuando agregamos un nodo a una escena, utilizamos el método addNode al cual le pasamos como argumento un objeto de tipo MyNode (ver método accept de la clase MyScene).

Widget w = MyScene.this.addNode(new MyNode(idGenerator.getNextId(), image, "Object " + (nodeCounter++), point));

cuando se llama el método addNode inmediatamente se dispara una llamada a la implementación del método attachNodeWidget que es donde recién se agrega el Widget a la escena

protected Widget attachNodeWidget(MyNode node) {

MyWidget widget = new MyWidget(this, mainLayer, interactionLayer, connectionLayer, node);

mainLayer.addChild(widget);

setFocusedWidget (widget);

validate();



return widget;

}

La gracia de usar un objeto MyNode es que podemos almacenar y obtener los datos propios del Widget, los cuales podemos utilizar luego para almacenarlos en un archivo xml, con lo cual le agregamos la función de importar y exportar la escena.

En la clase MyWidget agregamos la opción de crear conexiones con otros widgets creando una acción en particular en el constructor:

getActions().addAction(ActionFactory.createExtendedConnectAction(connectionLayer, new MyConnectionProvider(scene)));

Esto utiliza un objeto del tipo MyConnectionProvider el cual se encarga de generar un objeto MyEdge y lo agrega utilizando el método addEdge de la escena. Al llamar al método addEdge se dispara una llamada a la implementación del método attachEdgeWidget de la escena, el cual se encarga de agregar un widget de conexión.

En el caso de este ejemplo se creó una clase para el widget con la imagen (MyWidget) y otra para la conexión (MyConnectionWidget).
Ambos tienen la capacidad de modificar un texto en la escena ya que se les agrego la acción de edición usando createInplaceEditorAction.

Es interesante el poder agregar un menú a un Widget, lo cual nos da la posibilidad de añadir funcionalidad a los widgets. Para esto se utiliza un PopupMenuProvider el cual retorna un JPopupMenu el que a su vez puede contener JMenuItems con la funcionalidad que queramos en cada uno, ver la clase MyWidget.

popupMenuProvider = new PopupMenuProvider() {

public JPopupMenu getPopupMenu (final Widget widget, final Point location) {

return popupMenu;

}

};

Nuestro buen amigo Geertjan Wielenga nos dió un tip muy útil para agregar la funcionalidad de Resize de nuestros Widgets, tip que apliqué en este ejemplo y que podemos ver acá. El único problema es que es que para que ese tip funcione, se debe modificar la clase ImageWidget del API de la Visual Library, lo cual no es muy cómodo. Lo que hice fue crear una clase llamada MyImageWidget a la cual le apliqué el tip de Geertjan. También generé una clase llamada MyIconNodeWidget, la cual hace uso de la clase MyImageWidget (en vez de la clase ImageWidget). La clase MyWidget extiende de MyIconNodeWidget en vez de IconNodeWidget por lo que de esa forma se tiene la funcionalidad de Resize sin necesidad de cargar el código fuente de la API de la Visual Library.

También se agregó la funcionalidad de poder eliminar un widget (MyWidget o MyConnectionWidget) desde la escena presionando la tecla DELETE, para lo cual se creó la clase KeyEventLoggerAction, en donde el código para eliminar el widget es el siguiente:

public State keyReleased(Widget widget, WidgetKeyEvent event) {

if (event.getKeyCode() == KeyEvent.VK_DELETE) {

GraphScene s = (GraphScene)widget.getScene();

if(widget instanceof MyWidget) {

s.removeNode(s.findObject(widget));

return State.CONSUMED;

}

else if(widget instanceof MyConnectionWidget){

widget.removeFromParent();

return State.CONSUMED;

}

}



return State.REJECTED;

}

Lo importante acá es que para eliminar un objeto MyWidget se debe utilizar el método removeNode y en el caso de un objeto MyConnectionWidget se debe utilizar removeFromParent.

La acción de eliminar se agrega en las clases MyWidget y MyConnectionWidget.

Una opción muy útil, y que no he visto en Internet, es la capacidad de guardar la escena para que la podamos cargar en otro momento (importar/exportar). Para esto creé el método saveWidgetsToXML en la clase MyScene y lo que hace es tomar cada uno de los objetos MyWidget, toma la clase MyNode de cada uno y lo pasa a un XML, almacenando sus atributos como texto (incluyendo la imagen, usando Base64). También toma los objetos MyConnectionWidget, de cada uno toma el objeto MyEdge y los almacena en el mismo XML, guardando la relación entre Widgets.

public void saveWidgetsToXML() {

JFileChooser chooser = new JFileChooser ();

chooser.setDialogTitle ("Save Scene As XML");

chooser.setDialogType (JFileChooser.SAVE_DIALOG);

chooser.setMultiSelectionEnabled (false);

chooser.setFileSelectionMode (JFileChooser.FILES_ONLY);

chooser.setFileFilter (new FileFilter() {

public boolean accept (File file) {

if (file.isDirectory ())

return true;

return file.getName ().toLowerCase ().endsWith (".xml"); // NOI18N

}

public String getDescription () {

return "Extensible Markup Language (.xml)"; // NOI18N

}

});

if (chooser.showSaveDialog (new JFrame()) != JFileChooser.APPROVE_OPTION)

return;



File file = chooser.getSelectedFile ();

if (! file.getName ().toLowerCase ().endsWith (".xml")) // NOI18N

file = new File (file.getParentFile (), file.getName () + ".xml"); // NOI18N

if (file.exists ()) {

DialogDescriptor descriptor = new DialogDescriptor (

"File (" + file.getAbsolutePath () + ") already exists. Do you want to overwrite it?",

"File Exists", true, DialogDescriptor.YES_NO_OPTION, DialogDescriptor.NO_OPTION, null);

DialogDisplayer.getDefault ().createDialog (descriptor).setVisible (true);

if (descriptor.getValue () != DialogDescriptor.YES_OPTION)

return;

}



WidgetsXML wxml = new WidgetsXML(file);

wxml.prepareToSave();



List<Widget> list = mainLayer.getChildren();

for(int i=0; i<list.size(); i++) {

MyWidget w = (MyWidget)list.get(i);

MyNode n = w.getNode();

n.setLocation(w.getLocation());

wxml.addMyNode(n);

}



List<Widget> listConn = connectionLayer.getChildren();

for(int i=0; i<listConn.size(); i++) {

MyConnectionWidget w = (MyConnectionWidget)listConn.get(i);

MyEdge e = w.getMyEdge();

wxml.addMyEdge(e);

}



wxml.save();

}

El archivo XML tiene la forma

<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>

<raiz>

<my-nodes></my-nodes>

<my-edges></my-edges>

</raiz>

También se agregó la opción de cargar el XML y reconstruir la escena, para lo que se creó el método loadWidgetsFromXML

public void loadWidgetsFromXML() {

JFileChooser chooser = new JFileChooser ();

chooser.setDialogTitle ("Load Scene From XML");

chooser.setDialogType (JFileChooser.OPEN_DIALOG);

chooser.setMultiSelectionEnabled (false);

chooser.setFileSelectionMode (JFileChooser.FILES_ONLY);

chooser.setFileFilter (new FileFilter() {

public boolean accept (File file) {

if (file.isDirectory ())

return true;

return file.getName ().toLowerCase ().endsWith (".xml"); // NOI18N

}

public String getDescription () {

return "Extensible Markup Language (.xml)"; // NOI18N

}

});

if (chooser.showSaveDialog (new JFrame()) != JFileChooser.APPROVE_OPTION)

return;



File file = chooser.getSelectedFile ();



WidgetsXML wxml = new WidgetsXML(file);

wxml.prepareToLoad();



ArrayList<MyNode> myNodes = wxml.getMyNodes();

for(int i=0; i<myNodes.size(); i++) {

MyNode node = myNodes.get(i);

Widget w = MyScene.this.addNode(node);

getSceneAnimator().animatePreferredLocation(w, w.convertLocalToScene(node.getLocation()));

}



ArrayList<MyEdge> myEdges = wxml.getMyEdges();

MyNode source = null;

MyNode target = null;

for(int i=0; i<myEdges.size(); i++) {

MyEdge edge = myEdges.get(i);



for(int j=0; j<myNodes.size(); j++) {

MyNode n = myNodes.get(j);



if(n.getId().equals(edge.getSource()))

source = n;

if(n.getId().equals(edge.getTarget()))

target = n;

}



addEdge(edge);

setEdgeSource(edge, source);

setEdgeTarget(edge, target);

}

}

El detalle de la funcionalidad de los Widgets lo pueden ver leyendo el código fuente de este ejemplo. El código es muy limpio y simple, por lo que no creo que tengan problemas en entenderlo. Si hay dudas, comenten en el blog.

Dejo unas capturas de pantalla para que vean como luce la aplicación.



Saludos !!!

36 comentarios:

Rafael Guillermo dijo...

muy buen apunte... de verdad que esta muy buena la entrada..

Ahora quisiera hacerte una pregunta..
Hiciste un comentario sobre..
Geertjan Wielenga y David Kaspar, que fueron ellos los que enseñaron como funcionan las librerias de netbeans. fue algun manual que dieron o algo asi?? es posible acceder a ese documento..me interesaria saber sobre eso.

Ahora mi pregunta es.. La aplicacion de ejemplo de desarrollaste usa Netbeans Plataform Application.. si una persona desarrolla una aplicacion sobre esa esa plataforma, puede uno comercializarla??..
En la parte inicial de la aplicacion cargar la entrada de Netbeans, es posible colocar mi imagen personal o una nueva imagen que yo tenga..

Te agradezco tu colaboracion..

Soy desarrlladro Java - Bogota Colombia.
Espero que puedas colaborar.
Mi correo: mangelan03@gmail.com. gracias.

Daniel Dario Morales Salas dijo...

Hola Rafael

Respecto a la primera pregunta, la ayuda que recibí de Geertjan y David fue a través de correos, no hay documentos de por medio mas que la documentación existente de la biblioteca, los blogs de ellos y los correos que nos enviamos. Debido a que la documentación está, a mi juicio, fragmentada es que decidí hacer una entrada en mi blog (ésta entrada) dando un ejemplo aplicando lo mas importante para realizar una aplicación funcional haciendo uso de la Visual Library de Netbeans.

Actualmente estoy desarrollando una aplicación de control de "cosas" dentro de una casa o departamento (domótica), con la cual ya puedo controlar dispositivos on/off (ampolletas o bombillas fluorescentes o incandescentes, estas ultimas soportan dimmer) y camaras web, todo con visual library, de esa forma tienes un mapa de tu hogar y widgets que representan las cosas que quieres controlar, cada widget con su menu correspondiente con las opciones necesarias para el control.

Si desarrollas usando la netbeans platform application puedes comercializar tu aplicación sin problemas, de hecho, yo lo voy a hacer así con este proyecto que te comento, siempre que respetes la licencia de las bibliotecas que utilices, en el caso de la netbeans platform application, esta tiene doble licencia, GPL y CDDL http://netbeans.org/gplv2-faqs.html

Cualquier aplicación opensource que tu desarrolles la puedes comercializar.

La imagen si la puedes cambiar, cuando creas un nuevo proyecto que hace uso de la netbeans application platform, le das click derecho > propiedades > splash y ahi puedes seleccionar otra imagen.

Saludos !

Daniel Dario Morales Salas dijo...

Acá puedes ver algunas aplicaciones hechas sobre Netbeans application platform http://platform.netbeans.org/screenshots.html

La verdad es que te ahorra mucho tiempo de desarrollo y quedan geniales.

Saludos !

Rafael Guillermo dijo...

Gracias por tu pronta respuesta, lo que pasa es que desarrolle una aplicacion muy parecida a lo que tiene que ver con un simulador de redes, hasta el dia de hoy lo desarrolle a mano (puro codigo) hasta que un dia mi compañero de desarrollo me comento lo que existia una libreria que hacia todo lo que tanto trabajo nos costo.

Sim embargo debemos desarrollar una nueva version mas avanzada y la queremos desarrollar con esa libreria por que me parecio espectacular, pero hasta el dia de hoy la no conosco muy bien el manejo de las librerias de netbeans, especialmente ( Netbeans Plataform Application ) los diferentes paneles que trae no lo se manejar o mejor dicho no encuentro por donde colocarle informacion o paneles (por ejemplo en la parte de la PALETE, como colocaste hay las imagenes y todo eso), asi como mostraste en tu ejemplo. La libreria visual si estoy un poco familiarizado por que he hecho algunos ejemplos sencillos, pero la orta parte de los modulos, creeme que quede bastante perdido. no se como manipularlos.

Espero que me puedas colaborar.

Otra cosa. muy interesante tu aplicacacion, mi amigo tambien me habia comentado de una aplicacion como esa.

Pero como no hemos tenido tiempo para sentarnos a diseñar..pero bueno me alegro de tu trabajo..

En todas estas de donde sos voz...??

Yo soy de Bogota Colombia..

Daniel Dario Morales Salas dijo...

Hola, soy de Santiago de Chile.

Lo de como agregue las imágenes a la paleta, es bien simple, si necesitas algo como eso simplemente copia el paquete org.metalklesk.palette dentro de tu proyecto y ya tendrás lo necesario para construir tu propia paleta. La paleta tiene categorías, las cuales se definen en la clase CategoryChildren. En la clase ShapeChildren defines cuales son los iconos o imagenes que vas a mostrar dentro de las distintas categorías. Como ves, si usas las clases que doy en el ejemplo de esta entrada, hacer tu propia paleta es muy fácil. El enlace para descargar el ejemplo está aca: http://code.google.com/p/netbeans-visual-library-example/downloads/list

Para explicar así por encima, la plataforma netbeans es como un contenedor de módulos, los cuales se encargan de tareas específicas. Al trabajar con módulos, puedes extender tu aplicación sin necesidad de modificar todo o sacar versiones nuevas completas de tu aplicación, simplemente actualizas el módulo o creas uno nuevo que añada nueva funcionalidad a la aplicación ya existente.

Los módulos pueden depender unos de otros, por lo que les puedes configurar dependencias y puedes configurar que paquetes pueden ser vistos por otros módulos.

Los módulos son creados como proyectos independientes y los puedes enlazar a un Netbeans application platform. La gracia de los módulos es que puedes crear un archivo nbm, que son paquetes instalables dentro de una aplicación netbeans (incluso puedes instalar tu aplicación dentro de netbeans IDE).

Una ventaja de crear una aplicación usando netbeans application platform, es que te genera el software y lo deja listo para su distribución, con ejecutables unix y windows incluido.

Netbeans trae todo lo necesario para trabajar de esa manera y aprovechar funcionalidades ya desarrolladas, lo cual nos beneficia tanto por tiempo ahorrado como por la calidad de sus componentes. Por ejemplo, netbeans ya trae incorporado un modulo output, el cual muestra los mensajes que va arrojando nuestra aplicación, nosotros no tenemos que desarrollarlo. Ya maneja pestañas, no hay que desarrollarlo tampoco, trae soporte para una paleta, no tenemos que desarrollarlo, solo definirla como en mi ejemplo, ya trae un sistema de mensajeria para ir mostrando al usuario lo que va ocurriendo y suma y sigue.

En mi caso, estoy utilizando pocas cosas aún ya que no conozco toda la plataforma, recién he aprendido lo básico y ya me enamoré porque me ha ahorrado mucho tiempo. Por ejemplo el tema de las pestañas, hacerlo a mano es bastante código, hay que manejar muchas cosas, acá simplemente creas un Window Component, le dices en que área lo quieres (Editor por lo general, en el ejemplo es así para cargar la escena) y listo, lo de las pestañas es transparente para el desarrollador.

Eso te puedo contar por ahora, cualquier cosa lo comentas.

Saludos !

Rafael Guillermo dijo...

Compadre gracias por la informacion con tu ayuda ya pude entender todo,Revisando tu codigo en la clase EditorTopComponent me di cuenta que esa clase hereda de TopComponet y se hizo extraño y me puse a leer y encontre que las clases que heredan de esa son las que se poueden colocar dentro de los componente de Netbeans Plataform.. que espectacular todesoo , a simple vista mi aplicacion la estare reduciendo unas 500 lineas de codigo cotn odo esto, tienes mucha tazon en todo lo que dices..

En mi caso uso muchas pestañas que las estare quitando..

Lo bueno es que entendi esto, y empeze a desarrollar mi aplicacion en seguida.. gracias compadre..

Que pena preguntarte tanto.. Ya que empeze a desarrollar mi aplicacion, me pidienron que entregara una version basica en la empresa que trabajo, y por lo menos debo entregar una version basica..

Mi pregunta es.. que plugin o modulo debo agregar a mi aplicacion para que despues que haga l eantrega, solo siga mentregarlo odulos que necesiten, Que la misma aplicacion pueda instalar los nuevos modulos que voy desarrollando..

Asi como hace netbeans.. ir generando .nbm y que la aplicacion los descargue o se puedan instalar.

Si hay algun ejemplo me seria de mucha ayuda,..

O con que me digas que pasos debo hacer para eso.

Gracias de antemano..
Le agradezco su colaboracion..

Ana Josefa dijo...

Realmente soy nueva en la programación de Java, estoy desarrolando una aplicación usando la plataforma netbeans, la tengo diseñada por módulos pero no se como acceder a las clases de otros módulos..... pues utilicé un módulo encapsulado para el manejo de la bd y eso funciona bien... pero el segundo módulo de mi aplicativo necesita del primer módulo y no se cómo hacerlo... por favor agradecería tu ayuda

Rafael Guillermo dijo...

yo tambien tengo el mismo problema, alguien sabe como hacer??

Daniel Dario Morales Salas dijo...

Copio y pego la respuesta que le di a Ana a su correo:

Tal vez te falta definir que packages del primer modulo son visibles por otros modulos que dependen del primero. Si le das click derecho al modulo, al cual quieres acceder desde otros modulos, luego en propiedades y no recuerdo en que opcion aparece public packages, ahi estaran todos los packages del modulo y debes seleccionar los que quieres que sean visibles, luego guardas y listo.

Saludos !

Rafael Guillermo dijo...

Lo que comento Daniel es muuy correcto, pero falta un pequeño detalle..

Debes entrar a propiedades del modulo de donde quieres acceder a las clases del otro modulo, te vas a la opcion librerias (libraries) en la pestaña module dependencies - > luego en el boton add dependendy y adicional el modulo a cual quieres acceder a sus clases y listo..

Cualquier cosa nos comentas como te fue Ana..
chaoo

Gabriel dijo...

quiero agregar checkPoints en un mapa, el problema es que no se como definir que el background de lA SCENE sea un mapa, help!

Daniel Dario Morales Salas dijo...

En mi caso lo que hago es cargar el mapa como otro widget mas al cual le puedo definir la imagen que yo quiera y del tamaño que quiera. Ese widget tiene la propiedad de poder moverse y siempre va al fondo de la escena, tambien tiene la caracteristica de bloqueo, para que una vez que la coloco en la posicion que quiero, no la pueda mover por error una vez que la bloqueo.

Todas esas opciones se las puedes agregar al widget en particular, sin afectar los demas, incluso le puedes dar un menu con las opciones de bloqueo y desbloqueo, para que puedas mover el widget y luego bloquearlo o desbloquearlo (asi lo hago yo).

Esa es la forma en que yo cargo un mapa, luego es cosa de colocar los otros widgets sobre este y listo.

No se si se podrá agregar una imagen como background de la escena, yo no se hacerlo ni se si se podrá, pero solucioné tu mismo problema como te lo mencione recién.

Saludos !

Gabriel dijo...

Muchas Gracias por la idea DANIEL, voy a intenterlo... a penas tenga resultados comento ACA y si lo necesitan pego codigo, como para que otros no se topen con este problema

Gabriel dijo...

NO CONSIGO PONERLO "AL FONDO DE LA ESCENA", debo cambiarle la opacidad o hay alguna manera de establecer la gerarquia es decir quienes van adelante visualmente???

gabriel dijo...

* JERARQUIA!!

Gabriel dijo...

cuando hago el addChild(), pongo como indice el "0" asi queda de fondo ...
scene.addChild( 0 , new ImageWidget (scene, Utilities.loadImage("javaone/resources/maparesistencia1.gif")));

pablo dijo...

como podria guardas las coordenadas (X,Y) de los widgets en una base de datos

Daniel Dario Morales Salas dijo...

muy simple, debes obtener el punto (Point) con las coordenadas x, y para luego almacenarlas por el método que tu quieras.

List list = mainLayer.getChildren();
for(int i=0; i<list.size(); i++) {
MyWidget w = (MyWidget)list.get(i);
saveWidgetLocation(w.getLocation());
}

Como ves, con el método getLocation obtienes el punto en la escena donde está posicionado el widget, mas fácil imposible.

Saludos !!!

pablo dijo...

gracias por la rapida respuesta, Ahora mi duda es si habra una forma de corresponder cada coordenada de un widget con un registro especifico de una tabla, por ejemplo si en mi base de datos tengo ciudades, lo que quiero hacer es en una ciudad especifica guardar las cordenadas, por ejemplo que en la tabla ciudades en el registro de por ej. Buenos Aires se pueda guardar las cordenadas de el widget que esta en buenos aires, se entiende mi duda?

Daniel Dario Morales Salas dijo...

Eso que que quieres está bien pero no de la forma en que lo planteas ya que tiene un problema de diseño (no estas normalizando las tablas).

Lo que debes hacer es lo siguiente:
La tabla con las ciudades no cambia.
Crea un tabla Widget (o el nombre que quieras) que almacene los datos necesarios como X e Y.
Crea una relación de 1 a N de Ciudad a Widget (1 ciudad tiene muchos widgets), eso generará una llave foránea en la tabla Widget relacionandola con la tabla Ciudad.

En la parte java debes asociar el widget con la ciudad correspondiente (mediante un menú de selección por ejemplo), para eso te recomiendo agregar al nodo del widget (Node) el atributo con la clave de la ciudad.

Luego haces un metodo que almacene los datos.

Saludos !!!

Pablo dijo...

Perfecto gracias, igual lo de las ciudades era solo un ejemplo, pero ahora que me decis veo que puedo agregarle propiedades al nodo, creo que con eso me contestaste la duda
muchisimas gracias!!!

Claudio dijo...

Se puede integrar todo con una ventana que ya tiene componentes SWING como tablas, etc??

Daniel Dario Morales Salas dijo...

Claudio: Depende, porque hay compontes que requieren de la plataforma NetBeans RCP, por ejemplo la paleta NO te funcionará si tu aplicación swing no está basada en netbeans application platform, pero si te funcionará la escena (lo he comprobado, hablo con conocimiento de causa).

Lo mejor es que hagas tu aplicación basada en netbeans si quieres aprovechar sus ventajas.

Saludos !!

PABLO dijo...

Daniel use el metodo que te devuelve la lista de widgets y al mostrar las posiciones de todos, solo me muetra tres y las tres con las coordenadas (0,0)(las tres), es como que ignora los nodos que fui agregando, nose q puede ser... desde ya gracias por la constate ayuda

pablo dijo...

daniel ... el metodo getLocation() solo devuelve las posiciones de los widgets, y NO de los nodos, no habra un metodo similar pero que devuelva los POINTS donde se encuentran los NODOS????

Daniel Dario Morales Salas dijo...

la pregunta es, tiene sentido que el nodo tenga el método getLocation ?

respuesta: no

Claudio dijo...

Se puede saber que Nodo esta seleccionado de la lista de nodo cargados en la escena???

Claudio dijo...

Se puede saber que nodo esta seleccionado de varios nodos cargados en la escena??

Rafael Guillermo dijo...

De casualidad alguien de este post sabe como hacer para activar un modulo o algo asi, para ACTIVACIÓN DE PROGRAMAS POR CLAVE DE ACCESO..

Me explico.. Desarrolle una aplcacion en java, pero quiero adicionarle licencia, de tal manera que la aplicacion solicite licencia al iniciar la aplicacion. ?? alguien me puede ayudar a como debo hacer esto..

Anónimo dijo...

Amigo una pregunta como se debe hacer para que cuando carges un widget a la secena te muestre en la ventana de propiedades los campos del nodo....

Daniel Dario Morales Salas dijo...

Acá tienes la guía para hacer eso > http://platform.netbeans.org/tutorials/nbm-property-editors.html

saludos!

Rafael Guillermo dijo...

Por favor.. como puedo poner a correr el ejemplo del que estan hablando, que esta en el link http://platform.netbeans.org/tutorials/nbm-property-editors.html

Lo descargue.. pero es un .nbm
Lo instale en netbeans 6.8, pero no se como ejecutarlo.. o ponerlo en funcionamiento... puedo ver el codigo fuente del ejemplo?? Gracias

Rafael Guillermo dijo...

Daniel Morales, necesito una ayuda, lo que pasa es que ya he estado leyendo y he hecho algunos ejemplo y todo va bien, lo que necesito saber es como puedo hacer para que una linea ( en esta caso una relacion entre un Widget y otro) como puedo hacer para que linea sea punteada o no punteada, (lo que querria hacer yo sera que en la parte de la paleta yo pueda seleccionar trabajar con una linea punteada o linea normal )
por ejemplo (linea punteada: <--------->) o linea normal: (<_______>).. Gracias por la ayuda..

jose dijo...

oe reconcha de tu ma... se mas espescifico

Anónimo dijo...

necesito volver un archivo punto jar el cual invoulucras mas de dos pquetes si alguien sabe como hacerlo le agradeceria

Anónimo dijo...

hola Daniel :
Como puedo utilizar la librerias org.netbeans.spi.palette para un java desktop aplication.
Muchas gracias

Publicar un comentario en la entrada