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
tengo un problema al tratar de obtener el top component el método .getDefault() no me sale, es que tengo que agregar alguna dependecia? porque no puedo ver la foto que pusiste con las apis que usabas y el archivo del proyecto no lo puedo descargar porque el proxy de la escuela me lo bloquea. Gracias de antemano.
ResponderEliminar