Objetivo: Crear un Aplicacion Siute basada en Netbeans Plataform que tenga un entorno grafico ,que haga uso de LookUp API para la comunicacion entre componentes y la ventana de propiedades para visulizar las propiedades del Nodo.
Ok Empezemos.
Primero lo basico Crear un nuevo proyecto -> NetBeans Module -> NetBeans Platform Application
Ok le damos un nombre por ejemplo "Graph"
Creamos un modulo. para ello abrimos el arbol del proyecto en modulos -> click derecho y damos nuevo Modulo el nombre por ejemplo "Editor"
Ahora damos click derecho sobre el modulo propiedades -> Lebrerias
y agregamos las siguinetes dependencias qeu qeude de esta forma:
Abrimos el nodo de codigo y creamos 1 top componet dando click derecho nuevo Otro->ModuleDeveloped-> WindowComponent->WindowPosition en Editor y habilitamos el chek que dice open on aplication start
Le damos un nombre y le ponemos ejemplo "Visual Editor".
Agregamos en el formulario un BorderLayout y un ScrollPane que les quede de la siguiente forma:
Vamos al codigo fuente y escribimos lo siguiente en el constructor:
public VisualEditorTopComponent() { initComponents(); setName(NbBundle.getMessage(VisualEditorTopComponent.class,"CTL_VisualEditorTopComponent")); setToolTipText(NbBundle.getMessage(VisualEditorTopComponent.class,"HINT_VisualEditorTopComponent")); // setIcon(ImageUtilities.loadImage(ICON_PATH, true)); ScenaGrafica sg = new ScenaGrafica(); scrollpanel.setViewportView(sg.createView()); add(sg.createSatelliteView(), BorderLayout.WEST); associateLookup(sg.getLookup()); }
Creamos una clase en el paquete que se llame ScenaGrafica.java y le ponemos el siguiente codigo:
/** * * @author ulmum */ public class ScenaGrafica extends GraphScene{ private Lookup lookup; private InstanceContent content = new InstanceContent(); private LayerWidget capa_base = null; private static int x = 10; private static int y = 10; public ScenaGrafica() { capa_base = new LayerWidget(this); addChild(capa_base); addNode("Hola"); addNode("Luis"); addNode("Ulloa"); //Crea una bolsa abstracta lookup = new AbstractLookup(content); //getActions().addAction(ActionFactory.createSelectAction(new MySelectProvider())); } //Sobrescribe para que me de la bolsa que necesito @Override public Lookup getLookup() { return lookup; } @Override protected Widget attachNodeWidget(String node) { LabelWidget widget = new LabelWidget(this, node); widget.setPreferredLocation(new Point(x *= 2, y *= 2)); //crear movimiento al widget widget.getActions().addAction(ActionFactory.createMoveAction()); //Click sobre el widget evento del raton widget.getActions().addAction(new WidgetAction.Adapter() { @Override public State mouseClicked(Widget widget, WidgetMouseEvent event) { if (event.getButton()!=1) { return State.REJECTED; } LabelWidget nodo = (LabelWidget) widget; //Obtener el TopComponet VisualEditorTopComponent tc = VisualEditorTopComponent.getDefault(); //Object obj= findObject(arg0); //Crear el Nodo miNodo nd = new miNodo(nodo); //Ponerlo como activo en el topcomponent para que escuche la ventana de propiedades tc.setActivatedNodes(new Node[]{nd}); //tc.set //Mete a la bolsa el objeto y se modifica cuando se selecciona el objeto content.set(Collections.singleton(nodo), null); return State.CONSUMED; } }); //Crear la accion de seleccion cuando de click derecho del mouse //widget.getActions().addAction(ActionFactory.createSelectAction(new SeleccionProveedor(), true)); //Agregar el widget a la capa base //Dar el Borde widget.setBorder(BorderFactory.createRoundedBorder(10, 5, Color.yellow, Color.blue)); capa_base.addChild(widget); return widget; } @Override protected Widget attachEdgeWidget(Object edge) { throw new UnsupportedOperationException("Not supported yet."); } @Override protected void attachEdgeSourceAnchor(Object edge, String oldSourceNode, String sourceNode) { throw new UnsupportedOperationException("Not supported yet."); } @Override protected void attachEdgeTargetAnchor(Object edge, String oldTargetNode, String targetNode) { throw new UnsupportedOperationException("Not supported yet."); } private class SeleccionProveedor implements SelectProvider { public boolean isAimingAllowed(Widget arg0, Point arg1, boolean arg2) { return true; } public boolean isSelectionAllowed(Widget arg0, Point arg1, boolean arg2) { return true; } /** * Se ejecuta cuando se selecciona el widget * @param arg0 * @param arg1 * @param arg2 */ public void select(Widget arg0, Point arg1, boolean arg2) { //Cast del widget a labelwidget LabelWidget nodo = (LabelWidget) arg0; VisualEditorTopComponent tc = VisualEditorTopComponent.getDefault(); //Object obj= findObject(arg0); miNodo nd = new miNodo(nodo); tc.setActivatedNodes(new Node[]{nd}); //tc.set //Mete a la bolsa el objeto y se modifica cuando se selecciona el objeto content.set(Collections.singleton(nodo), null); } } }
Ahora creamos un topcomponet que va escuchar cuando cuando seleccionamos un nodo para ello crean un topcomponent y agregan un jlabel e impementan al topcomponete el LookupListener les debe quedar algo asi resumiendo:
public final class VisorTopComponent extends TopComponent implements LookupListener
Ahora escribimos el codigo del metodo componentOpened que se ejecuta cuando el componente abre y ponemos lo siguiente:
@SuppressWarnings("unchecked") public void componentOpened() { //tpl criterio de busqueda del Lookup en este caso como meti en la bolsa un LabelWidget busco por LabelWidget.class Lookup.Template tpl = new Lookup.Template(LabelWidget.class); //Buscar el bolsa global el criterio result = Utilities.actionsGlobalContext().lookup(tpl); //Registrar el evento que escucha cuando un objeto se mete a la bolsa o se saca se le asigna este mismo componete result.addLookupListener(this); }
Ha como nueva propiedad de la clase deben crear el result de la siguiente manera:
private Result result;
Ok ahora debemos escribir cuando el componente se cierra el metodo componentClosed
public void componentClosed() { result.removeLookupListener(this); result = null; }
He implentamos el metodo que sobrescribe la intefaz LookUpListener
public void resultChanged(LookupEvent ev) { //System.out.println(ev); Lookup.Result r = (Lookup.Result) ev.getSource(); Collection c = r.allInstances(); //System.out.println("Tamanio de la coleccion " + c.size()); if (!c.isEmpty()) { LabelWidget o = (LabelWidget) c.iterator().next(); jLabel1.setText(o.getLabel()); } else { jLabel1.setText("[no selection]"); //Vaciar la ventana de propiedades del compenente Visual //VisualEditorTopComponent tc = VisualEditorTopComponent.getDefault(); //Object obj= findObject(arg0); //tc.setActivatedNodes(new Node[]{Node.EMPTY}); } }
Y la parte final creamos un clase miNodo.java que extiende la clase AbstractNode esto es para que mustre en la ventana de propiedades el objeto seleccionado ponemos el siguiente codigo
/** * * @author ulmum * Mi Nodo es para usar la sheet properties */ public class miNodo extends AbstractNode { public miNodo(LabelWidget widget) { super(Children.LEAF,Lookups.singleton(widget)); setDisplayName("Propiedades del Nodo " + widget.getLabel()); } public miNodo() { super(Children.LEAF); setDisplayName("Root"); } @Override protected Sheet createSheet() { Sheet sheet = Sheet.createDefault(); Sheet.Set set = Sheet.createPropertiesSet(); LabelWidget obj = getLookup().lookup(LabelWidget.class); try { Property label = new PropertySupport.Reflection(obj, String.class, "getLabel", null); label.setName("Nombre Etiqueta"); set.put(label); } catch (NoSuchMethodException ex) { ErrorManager.getDefault(); } sheet.put(set); return sheet; } }
Una vez hecho todo esto corremos y probamos si tienen alguna duda favor enviar sus comentarios adjunto el proyecto en zip para ser descargado
aqui