Avbravo plataforma TutorialVisualLibrary IconNodeWidget

V. Añadiendo un IconNodeWidget mediante la funcionalidad de Arrastrar y Colocar

Antes, utilizamos constructor de la clase de GraphSceneImpl para pasar una escena al TopComponent JScrollPane . Hasta ahora, la escena existe, pero no tiene comportamiento. El Comportamiento se agrega a través de acciones. La acción que veremos en esta sección se llama AcceptAction. Esta acción permite habilitar la funcionalidad de arrastrar y colocar. La funcionalidad de arrastrar y colocar podría aplicarse a un widget, pero aquí se aplicara a la misma escena.


Nosotros utilizamos createAcceptAction para que se especifique lo que debe suceder cuando un elemento de la paleta se arrastra sobre la escena. Dos métodos participan aquí. El primero, isAcceptable(), se utiliza para determinar si el elemento es aceptable a la escena. Aquí puede probar el elemento, que es transferible. También puede definir la imagen a arrastrar, que es todo lo que hacemos en la aplicación a continuación. Si se devuelve true, se llama al método de aceptar. Aquí obtenemos la imagen transferible, usando el mismo método auxiliar como se realizo anteriormente. A continuación, llamamos al método addNode, creando una instancia de un nuevo IconNodeWidget y pasando la imagen transferible que se obtiene.

Todo el código en esta sección es interrelacionado, y recibirá un error subrayado en rojo en su código hasta que se ha añada todos los métodos siguientes, se trata de agregar todo en algún tipo de orden lógico!


1.Primero, agregar el createAcceptAction, con sus dos métodos, al constructor de la clase GraphSceneImpl :


getActions().addAction(ActionFactory.createAcceptAction(new AcceptProvider() {

public ConnectorState isAcceptable(Widget widget, Point point, Transferable transferable) {

 Image dragImage = getImageFromTransferable(transferable);
 JComponent view = getView();
       Graphics2D g2 = (Graphics2D) view.getGraphics();
       Rectangle visRect = view.getVisibleRect();
 view.paintImmediately(visRect.x, visRect.y, visRect.width, visRect.height);
  g2.drawImage(dragImage,              AffineTransform.getTranslateInstance(point.getLocation().getX(),
               point.getLocation().getY()),null);
 
     return ConnectorState.ACCEPT;

  }
public void accept(Widget widget, Point point, Transferable transferable) {
       Image image = getImageFromTransferable(transferable);
 Widget w = GraphSceneImpl.this.addNode(new MyNode(image));
      w.setPreferredLocation(widget.convertLocalToScene(point));
   }

}));


Nota: Después de agregar el código anterior, seguirá aparenciendo subrayados en rojo, indicando que existen errores. Estos errores son porque el código anterior se refiere a un método y una clase que aún no ha creado. Se crearan en los próximos pasos.

2. Siguiente, en la clase GraphSceneImpl agregar un método de ayuda para recuperar la imagen desde el transferible


private Image getImageFromTransferable(Transferable transferable) {

   Object o = null;

  try {
  o = transferable.getTransferData(DataFlavor.imageFlavor);
   } catch (IOException ex) {
       ex.printStackTrace();

  } catch (UnsupportedFlavorException ex) {
       ex.printStackTrace();
   }
   return o instanceof Image ? (Image) o : Utilities.loadImage("org/netbeans/shapesample/palette/shape1.png");

}

Tenga en cuenta que puede definir cualquier tipo de imagen cuando una imagen no es devuelto con éxito de este método auxiliar. Por ahora utilizaremos la imagen de "shape1.png" en su lugar.

3.Crear una nueva clase que se llama MyNode. Esta clase representa un nodo en un modelo orientado a gráfico. No puede ser una imagen directamente, dado que cada nodo tiene que ser único (comprobado por el método "igual") en el modelo. Si se utiliza las imágenes directamente, a continuación, se podrá tener sólo 3 de los nodos (uno para cada imagen) en la escena. Utilizando la clase de MyNode, cada nodo puede puede tener múltiples nodos y o una instancia de imagen compartido.


public class MyNode {


   private Image image;


   public MyNode(Image image) {
       this.image = image;
   }


   public Image getImage() {
       return image;
   }

}


4.Cambiar la firma de la clase GraphSceneImpl a lo siguiente, para que el nodo sea recibido por la clase de implementación de la biblioteca visual:

extends GraphScene<MyNode, String>

Dejar que el IDE Genere nuevos códigos auxiliares para los métodos de abstractos. File:20strubs_Avbravo_plataforma_TutorialVisualLibrary_IconNodeWidget.png Damos click sobre el icono en la barra lateral izquierda de NetBeans, y generamos los métodos abstractos.


Además, dado que son ahora usamos genéricos, asegurarse de que el IDE es usando JDK 1.5. Si no estás seguro de si se está utilizando 1.6, haga clic con el botón derecho del mouse en el proyecto, elija Propiedades y vaya a la página de fuentes. Cambie el nivel de origen en la lista desplegable a 1.5.

5. Por último, definir el nuevo widget en la clase GraphSceneImpl. Este método es llamado automáticamente por el método accept. Utilizarlo para definir un widget de la biblioteca visual cuando se elimina el elemento de la paleta.

protected Widget attachNodeWidget(MyNode node) {

   IconNodeWidget widget = new IconNodeWidget(this);
   widget.setImage(node.getImage());
   widget.setLabel(Long.toString(node.hashCode()));
   widget.getActions().addAction(ActionFactory.createMoveAction());
   mainLayer.addChild(widget);
   return widget;

}

Observe que establecemos la imagen que se recupere el nodo. También generar un número aleatorio por lo que ya tenemos una etiqueta. De forma predeterminada, el widget existe, pero no tiene comportamiento. Aquí, creamos una acción para mover, para que se puede mover el widget en la escena. Por último, antes de regresar el widget a la escena, agregamos com un hijo del LayerWidget que creamos en la sección anterior.


6. Volver a cargar el módulo y abra la ventana de graficos de nuevo. Ahora puede arrastrar y colocar elementos de la paleta. Mientras arrastra un elemento sobre la escena, podrá ver la imagen de arrastre. Cuando colocar un elemento, se convierte en un widget y es visible en la escena.



| Anterior| Indice| Siguiente

Not logged in. Log in, Register

By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2012, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo