Problema sobre gráficos

Estimado, tengo un problemilla y quisiera saber si me puedes orientar ...
Necesito almacenar la distribución resultante de sobreponer imágenes pequeñas en una más grande .
Esto es, por ejemplo yo tengo una imagen rectangular representando una recamara, ahí quiero poner una imagen que representa una silla y la quiero poner en un lugar especifico, almacenarlo
Y cuando se recupere, saber que la silla quedo, digamos 5cm a la derecha del centro de la imagen, 10 cm hacia abajo de la linea superior ( son 3 imágenes máximo las que se deberán de sobreponerse )
Si sabes donde puedo hallar un ejemplo para estudiar el código, te lo agradecería.
Saludos.

1 Respuesta

Respuesta
1
Bueno la cosa no es tan complicada como parece, para hacer eso lo que debes es tener en cuenta son 3 cosas:
1- El orden en que dibujas las imágenes, o sea, para que parezca el efecto de que las imágenes más pequeñas están encima de la más grande debes dibujar primero la más grande y luego las más pequeñas.
2- Debes a prender a trabajar con el sistema de coordenadas de la clase java. Awt. Graphics y entender que todo esta sobre un plano bidimensional, solo unas cosas se dibujan encima de otras.
3- Debes crear clases (objetos) que representen las imágenes con sus coordenadas dentro del cuadro de dibujo para que de esa forma, con una estructura de datos o cualquier sistema de almacenamiento puedas guardar y cargar los elementos que hacen parte del dibujo, o sea los objetos imágenes.
Yo tengo ejemplos de dibujos pero no hacen exactamente lo que tu necesitas. Si mi explicación no fue suficiente y quieres que te envíe un ejemplo, házmelo saber y con gusto te lo enviaré, :). Suerte, bye.
Estimado :
Todo lo que tengas me sirve ya que yo no se de java, en lo que yo he trabajado es en PHP.
Así que, voy a tener que aprender ... creo que eso es bueno ...
package simulador;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class Fondo extends JPanel implements MouseListener, MouseMotionListener,
KeyListener, ActionListener {
private Vector nodos;
private Vector lineas;
public static final int MODO_NORMAL = 0;
public static final int MODO_NUEVO_PC = 1;
public static final int MODO_NUEVO_SW = 6;
public static final int MODO_NUEVA_LINEA = 2;
private final int MODO_SELECCION_NODO = 3;
private final int MODO_CREANDO_LINEA = 4;
private final int MODO_FINALIZANDO_LINEA = 5;
private int modo;
private int contadorElementos = 0;
private Nodo origenLinea;
private Nodo destinoLinea;
private ElementoDibujable seleccion;
private Point a, b, temp;
private int last_x, last_y;
private PopupFactory creadorPopup;
private Popup popup;
private JTextPane textoTip = new JTextPane();
private JPanel panelTip = new JPanel();
private JPopupMenu menuContextual = new JPopupMenu();
private JMenuItem menuARP = new JMenuItem( "Ver ARP" );
private JMenuItem menuInfo = new JMenuItem( "Ver informaci¾n de equipo" );
private JMenuItem menuEnviar = new JMenuItem(
"Enviar paquete a otro equipo" );
private Cursor cursorPc = Toolkit.getDefaultToolkit().createCustomCursor(
Global.CURSOR_PC.getImage(), new Point( 0, 0 ), "Nuevo pc" );
private Cursor cursorSwitch = Toolkit.getDefaultToolkit().
createCustomCursor(
Global.CURSOR_SWITCH.getImage(), new Point( 0, 0 ), "Nuevo switch" );
private Cursor cursorLinea = Toolkit.getDefaultToolkit().
createCustomCursor(
Global.BOTON_LINEA.getImage(),
new Point( Global.BOTON_LINEA.getIconWidth() / 2,
Global.BOTON_LINEA.getIconHeight() / 2 ), "Nuevo switch" );
private Cursor cursorNormal = Toolkit.getDefaultToolkit().
createCustomCursor(
Global.CURSOR_NORMAL.getImage(), new Point( 0, 0 ), "default" );
public Fondo() {
enableEvents( AWTEvent.KEY_EVENT_MASK |
AWTEvent.INPUT_METHOD_EVENT_MASK );
nodos = new Vector();
lineas = new Vector();
this.setBackground( Color.white );
this.addMouseListener( this );
this.addMouseMotionListener( this );
this.addKeyListener( this );
t = new Timer( 4000, this );
t.setInitialDelay( 500 );
t.setRepeats( false );
creadorPopup = new PopupFactory();
textoTip.setBackground( SystemColor.textHighlight.brighter() );
textoTip.setForeground( SystemColor.textText );
textoTip.setEditable( false );
textoTip.setFocusable( false );
textoTip.setContentType( "text/html" );
panelTip.setLayout( new BorderLayout() );
panelTip.setBorder( BorderFactory.createLineBorder( Color.
black ) );
panelTip.add( textoTip );
tiempoDeExposicion = new Timer( 4000, this );
tiempoDeExposicion.setRepeats( false );
this.cambiarModo( MODO_NORMAL );
menuContextual.add( menuARP );
menuContextual.add( menuInfo );
menuContextual.add( menuEnviar );
menuEnviar.setIcon(Global.PAQUETE);
menuInfo.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
JOptionPane.showMessageDialog(null,seleccion);
DatosPC datos = new DatosPC( ( PC ) seleccion );
if ( datos.fueAceptado() ) {
Fondo.this.repaint();
}
}
} );
}
public boolean isFocusable() {
return true;
}
public ElementoDibujable obtenerElemento( int id ) {
for ( int i = 0; i < nodos.size(); i++ ) {
ElementoDibujable e = ( ElementoDibujable ) nodos.elementAt( i );
if ( e.obtenerId() == id ) {
return e;
}
}
for ( int i = 0; i < lineas.size(); i++ ) {
ElementoDibujable e = ( ElementoDibujable ) lineas.elementAt( i );
if ( e.obtenerId() == id ) {
return e;
}
}
return null;
}
public void cambiarModo( int modo ) {
this.modo = modo;
switch ( modo ) {
case MODO_NUEVO_PC:
this.setCursor( cursorPc );
break;
case MODO_NUEVO_SW:
this.setCursor( this.cursorSwitch );
break;
case MODO_NUEVA_LINEA:
case MODO_CREANDO_LINEA:
this.setCursor( this.cursorLinea );
break;
default:
this.setCursor( this.cursorNormal );
}
}
/*private void cambiarModo( int modo ){
}*/
public void mouseDragged( MouseEvent e ) {
if ( modo == MODO_SELECCION_NODO && seleccion != null ) {
//rect.setLocation(last_x + e.getX(), last_y + e.getY());
seleccion.cambiarUbicacion( new Point( last_x + e.getX(),
last_y + e.getY() ) );
this.repaint();
}
}
Timer t;
private Timer tiempoDeExposicion;
public void mouseMoved( MouseEvent e ) {
if ( modo == MODO_CREANDO_LINEA ) {
b = e.getPoint();
repaint();
}
else if ( modo == MODO_NORMAL ) {
t.restart();
temp = e.getPoint();
}
}
public void mousePressed( MouseEvent e ) {
switch ( modo ) {
case MODO_NUEVO_SW: {
Nodo n = new Switch( new Point( e.getPoint().x -
( Global.SW.getIconWidth() / 2 ),
e.getPoint().y -
( Global.SW.getIconHeight() / 2 ) ),
contadorElementos++ );
nodos.addElement( n );
//this.cambiarModo( MODO_NORMAL );
repaint();
break;
}
case MODO_NUEVO_PC: {
Nodo n = new PC( new Point( e.getPoint().x -
( Global.PC.getIconWidth() / 2 ),
e.getPoint().y -
( Global.PC.getIconHeight() / 2 ) ),
contadorElementos++ );
nodos.addElement( n );
//this.cambiarModo( MODO_NORMAL );
repaint();
break;
}
case MODO_NUEVA_LINEA: {
Nodo n = buscarNodo( e.getPoint() );
if ( n != null ) {
n.cambiarTipoDeBorde( Nodo.BORDE_PUNTEADO );
origenLinea = n;
a = n.obtenerCentro();
b = a;
this.cambiarModo( MODO_CREANDO_LINEA );
}
else {
this.cambiarModo( MODO_NORMAL );
}
repaint();
break;
}
case MODO_SELECCION_NODO:
case MODO_NORMAL: {
if ( seleccion != null ) {
seleccion.cambiarSeleccion( false );
}
seleccion = null;
Nodo n = buscarNodo( e.getPoint() );
if ( n != null ) {
n.cambiarTipoDeBorde( Nodo.NORMAL );
this.cambiarModo( MODO_SELECCION_NODO );
seleccion = n;
}
else {
for ( int i = 0; i < lineas.size(); i++ ) {
Linea l = ( Linea ) lineas.elementAt( i );
if ( l.contieneElPunto( e.getPoint() ) ) {
l.cambiarSeleccion( true );
seleccion = l;
break;
}
}
}
if ( seleccion != null ) {
last_x = seleccion.getX() - e.getX();
last_y = seleccion.getY() - e.getY();
}
else {
this.cambiarModo( MODO_NORMAL );
}
repaint();
break;
}
case MODO_CREANDO_LINEA: {
Nodo n = buscarNodo( e.getPoint() );
if ( n != null ) {
n.cambiarTipoDeBorde( Nodo.BORDE_PUNTEADO );
destinoLinea = n;
this.cambiarModo( MODO_FINALIZANDO_LINEA );
repaint();
}
break;
}
default:
this.cambiarModo( MODO_NORMAL );
}
}
private Nodo buscarNodo( Point punto ) {
for ( int i = 0; i < nodos.size(); i++ ) {
Object elem = nodos.elementAt( i );
Nodo n = ( Nodo ) elem;
if ( n.contieneAlPunto( punto ) ) {
return n;
}
}
return null;
}
public void mouseReleased( MouseEvent e ) {
try {
switch ( modo ) {
case MODO_FINALIZANDO_LINEA: {
boolean conectados = origenLinea.estaConectadoCon(
destinoLinea );
if ( origenLinea != null && destinoLinea != null &&
!conectados &&
!( conectados = ( origenLinea == destinoLinea ) ) ) {
Linea l = new Linea( a,
b,
contadorElementos++ );
origenLinea.conectarLinea( l, true );
destinoLinea.conectarLinea( l, false );
lineas.addElement( l );
this.cambiarModo( MODO_NUEVA_LINEA );
origenLinea.cambiarTipoDeBorde( Nodo.SIN_BORDE );
destinoLinea.cambiarTipoDeBorde( Nodo.SIN_BORDE );
repaint();
}
if ( conectados ) {
this.cambiarModo( MODO_NORMAL );
origenLinea.cambiarTipoDeBorde( Nodo.SIN_BORDE );
destinoLinea.cambiarTipoDeBorde( Nodo.SIN_BORDE );
repaint();
}
break;
}
case MODO_SELECCION_NODO: {
if ( e.isPopupTrigger() ) {
menuContextual.show( this, e.getX(), e.getY() );
}
}
}
}
catch ( Exception ex ) {
ex.printStackTrace();
}
}
public void mouseClicked( MouseEvent e ) {}
public void mouseEntered( MouseEvent e ) {
this.requestFocus();
}
public void mouseExited( MouseEvent e ) {
t.stop();
}
public void paintComponent( Graphics g ) {
super.paintComponent( g );
for ( int i = 0; i < lineas.size(); i++ ) {
Linea l = ( Linea ) lineas.elementAt( i );
l.dibujar( g );
}
for ( int i = 0; i < nodos.size(); i++ ) {
Nodo n = ( Nodo ) nodos.elementAt( i );
n.dibujar( g );
}
if ( modo == MODO_CREANDO_LINEA ||
modo == MODO_FINALIZANDO_LINEA ) {
Graphics2D g2 = ( Graphics2D ) g;
BasicStroke dotted = new BasicStroke( 2, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_ROUND, 0,
new float[] {2, 10, 2, 10}
, 0 );
g2.setStroke( dotted );
g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON );
g2.drawLine( a.x, a.y, b.x, b.y );
}
}
public void keyPressed( KeyEvent e ) {
if ( e.getKeyCode() == e.VK_DELETE && seleccion != null ) {
if ( nodos.contains( seleccion ) ) {
Nodo n = ( Nodo ) seleccion;
int lines[] = n.obtenerIdLineas();
for ( int i = 0; i < lines.length; i++ ) {
Linea l = buscarLinea( lines );
for ( int j = 0; j < nodos.size(); j++ ) {
Nodo naux = ( Nodo ) nodos.elementAt( j );
naux.desconectarLinea( l.obtenerId() );
}
lineas.remove( l );
}
nodos.remove( n );
}
else if ( lineas.contains( seleccion ) ) {
Linea l = ( Linea ) seleccion;
for ( int i = 0; i < nodos.size(); i++ ) {
Nodo n = ( Nodo ) nodos.elementAt( i );
n.desconectarLinea( l.obtenerId() );
}
lineas.remove( l );
}
seleccion = null;
repaint();
}
}
private Linea buscarLinea( int idLinea ) {
for ( int i = 0; i < lineas.size(); i++ ) {
Linea l = ( Linea ) lineas.elementAt( i );
if ( l.obtenerId() == idLinea ) {
return l;
}
}
return null;
}
public void keyReleased( KeyEvent e ) {
}
public void keyTyped( KeyEvent e ) {
}
public void actionPerformed( ActionEvent e ) {
if ( e.getSource() == tiempoDeExposicion ) {
if ( popup != null ) {
popup.hide();
popup = null;
}
if ( tiempoDeExposicion.isRunning() ) {
tiempoDeExposicion.stop();
}
return;
}
Nodo p = this.buscarNodo( temp );
if ( p != null ) {
Point ubicacionEnPantalla = this.getLocationOnScreen();
textoTip.setText( "<html><Strong>" + p.obtenerId() +
"</Strong></html>" );
this.actionPerformed( new ActionEvent( tiempoDeExposicion, 0, null,
0 ) );
popup = creadorPopup.getPopup( this, panelTip,
ubicacionEnPantalla.x + temp.x + 15,
ubicacionEnPantalla.y + temp.y );
popup.show();
tiempoDeExposicion.start();
}
}
}

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas