miércoles, 22 de octubre de 2008

VisualLibrary Widgets y conecciones

Como usar la libreria VisualLibrary de NetBeans que puede descargar de
http://graph.netbeans.org/

y aqui puedes ver un tutorial del que me estoy basando para este blog
http://www.netbeans.org/download/flash/netbeans_60/jl_preso_vislib/player.html

El Unico JAR que necesitan es el org-netbeans-api-visual.jar que pueden bajar de
http://graph.netbeans.org/files/documents/188/1298/VisualLibrary2-dev-070205.zip

Lo que se pretende aqui es hacer una ventanita en la que se puedan agregar Widgets estos compoentes se van a poder mover en la pantalla con el mouse y se van a poder crear con tan solo dar click en la pantalla.

Con la tecla Control se van a poder conectar estos widgets entre si.

Aqui esta algo de codigo que hice. espero que les guste y que les ayude para hacer otras cosas interesantes.

Bueno aqui les va el código

package com.ernesto.ejemplo;

import java.awt.*;

import javax.swing.*;

import org.netbeans.api.visual.action.*;

import org.netbeans.api.visual.anchor.*;

import org.netbeans.api.visual.border.BorderFactory;

import org.netbeans.api.visual.widget.*;

/**

* Esta clase genera una ventana en la que se pueden meter elementos widgets con un solo click

* y luego conectarlos dejando presionada la tecla control

* @author Ernesto Maldonado Thomas

*/

public class EjemploVisualLibrary extends JFrame {

private Scene scene;

private JComponent view;

private LayerWidget mainLayer;

private LayerWidget interractionLayer;

private LayerWidget connectionLayer;

/**

* Constructor.

*/

public EjemploVisualLibrary() {

super("Primer ejemplo de Visual en Eclipse");

setDefaultCloseOperation(EXIT_ON_CLOSE);

setExtendedState(MAXIMIZED_BOTH);

initComponentes();

}

private void initComponentes() {

scene = new Scene();

// Este componente view es la parte visual de todo esto

view = scene.createView();

setLayout(new BorderLayout());

add(view, BorderLayout.CENTER);

// Para la seleccionar o crear windgets

mainLayer = new LayerWidget(scene);

scene.addChild(mainLayer);

// Para el movimiento del widget

interractionLayer = new LayerWidget(scene);

scene.addChild(interractionLayer);

//Para la coneccion entre widgets

connectionLayer = new LayerWidget(scene);

scene.addChild(connectionLayer);

// Para poder seleccionar o crear un widget

scene.getActions().addAction(ActionFactory.createSelectAction(new MySelectProvider()));

}

/**

* Crea un proveedor de seleccion para las acciones de seleccion de los widgets

* @author Ernesto Maldonado Thomas

*/

class MySelectProvider implements SelectProvider {

/* (non-Javadoc)

* @see org.netbeans.api.visual.action.SelectProvider#isAimingAllowed(org.netbeans.api.visual.widget.Widget, java.awt.Point, boolean)

*/

@Override

public boolean isAimingAllowed(Widget arg0, Point arg1, boolean arg2) {

return false;

}

/* (non-Javadoc)

* @see org.netbeans.api.visual.action.SelectProvider#isSelectionAllowed(org.netbeans.api.visual.widget.Widget, java.awt.Point, boolean)

*/

@Override

public boolean isSelectionAllowed(Widget arg0, Point arg1, boolean arg2) {

return true;

}

/* (non-Javadoc)

* @see org.netbeans.api.visual.action.SelectProvider#select(org.netbeans.api.visual.widget.Widget, java.awt.Point, boolean)

*/

@Override

public void select(Widget cWidget, Point p, boolean arg2) {

//Se crea un tipo de widget

LabelWidget widget = new LabelWidget(scene, "Widget");

// Se le asigna una posicion

widget.setPreferredLocation(cWidget.convertLocalToScene(p));

// Se puede decorar con algun borde

widget.setBorder(BorderFactory.createRoundedBorder(10, 5, Color.yellow, Color.blue));

//Se agrega la accion para poner conexiones

widget.getActions().addAction(ActionFactory.createExtendedConnectAction(connectionLayer, new MyConnectProvider()));

//Se agrega la accion para mover el widget en la pantalla

widget.getActions().addAction(ActionFactory.createAlignWithMoveAction(mainLayer, interractionLayer, null));

mainLayer.addChild(widget);

}

}

/**

* Crea un Proveedor de coneccion para los widgets

* @author Ernesto Maldonado Thomas

*/

class MyConnectProvider implements ConnectProvider {

/* (non-Javadoc)

* @see org.netbeans.api.visual.action.ConnectProvider#createConnection(org.netbeans.api.visual.widget.Widget, org.netbeans.api.visual.widget.Widget)

*/

@Override

public void createConnection(Widget source, Widget target) {

// Genera la conexion, para la escena

ConnectionWidget connection = new ConnectionWidget(scene);

// Se le asigna el tipo de conector final (Figura)

connection.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED);

//Se conecta al origen

connection.setSourceAnchor(AnchorFactory.createRectangularAnchor(source));

// Se conecta al destino

connection.setTargetAnchor(AnchorFactory.createRectangularAnchor(target));

//Se agrega la conexion al layer de conexion

connectionLayer.addChild(connection);

}

/* (non-Javadoc)

* @see org.netbeans.api.visual.action.ConnectProvider#hasCustomTargetWidgetResolver(org.netbeans.api.visual.widget.Scene)

*/

@Override

public boolean hasCustomTargetWidgetResolver(Scene arg0) {

return false;

}

/* (non-Javadoc)

* @see org.netbeans.api.visual.action.ConnectProvider#isSourceWidget(org.netbeans.api.visual.widget.Widget)

*/

@Override

public boolean isSourceWidget(Widget s) {

return s instanceof LabelWidget;

}

/* (non-Javadoc)

* @see org.netbeans.api.visual.action.ConnectProvider#isTargetWidget(org.netbeans.api.visual.widget.Widget, org.netbeans.api.visual.widget.Widget)

*/

@Override

public ConnectorState isTargetWidget(Widget s, Widget t) {

return s != t && t instanceof LabelWidget ? ConnectorState.ACCEPT : ConnectorState.REJECT;

}

/* (non-Javadoc)

* @see org.netbeans.api.visual.action.ConnectProvider#resolveTargetWidget(org.netbeans.api.visual.widget.Scene, java.awt.Point)

*/

@Override

public Widget resolveTargetWidget(Scene arg0, Point arg1) {

return null;

}

}

public static void main(String []args) {

SwingUtilities.invokeLater(new Runnable(){

@Override

public void run() {

new EjemploVisualLibrary().setVisible(true);

}});

}

}


Espero que les guste y que les interese, si adquieren mas conocimiento y lo publican me gustaria compartirlo Muchas gracias

2 comentarios:

Esteban Chamba dijo...

Que tal.. tengo una pregunta relacionada con widgets, espero me pueda ayudar.. ahi va

Estoy creando un servicio SOAP para un sistema, y necesito q brinde servicio de widgets (tal como twitter o youtube).. quisiera saber que debo usar, o si solamente el tema de widgets va de parte del cliente.. por favor una orientación, estoy desarrollando en php

Ing. Ernesto Maldonado dijo...

Hola, ya que estas haciendo una pagia en PHP te recomiendo lo siguiente, los widgets los puedes hacer con AJAX, puedes bajarte algunas librerias como Scriptaculous que son archivos .js de java script con funciones que te pueden ayuadr con tu desarrollo.

http://script.aculo.us/

Tambien puedes usar Prototype

http://www.prototypejs.org/

y para que se vea todo bonito usa CSS te recomiendo los tutoriales en

http://www.w3.org/
http://www.w3schools.com/

Con estas herramientas veras que puedes hacer paginas muy bonitas e interactivas que ademas puedes carcar raídamente, te recomiendo usar pocas imagenes y veras resultados sorprendentes.
Saludos