Foros del Web » Programación para mayores de 30 ;) » Java »

tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

Estas en el tema de tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio en el foro de Java en Foros del Web. muy buenas, veréis estoy tratando de hacer un pequeño trabajo por mi cuenta sobre todo con el fin de aprender y llevo días atascado, lo ...
  #1 (permalink)  
Antiguo 15/11/2014, 06:18
dr4
 
Fecha de Ingreso: noviembre-2014
Mensajes: 28
Antigüedad: 9 años, 5 meses
Puntos: 0
tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

muy buenas, veréis estoy tratando de hacer un pequeño trabajo por mi cuenta sobre todo con el fin de aprender y llevo días atascado, lo que intento es crear una imagen de fondo que crezca y se encoja con la ventana, conseguí hacerlo sin problemas usando un borderlayout y asignandole center pero es problema es que luego quiero agregarle otra imagen que esté en el centro pero no ocupe toda la pantalla(por encima del fondo de pantalla) y que esa imagen también crezca y se encoja con la ventana, he usado un listener que me avise de la anchura y la altura de la ventana en todo momento y he tratado de asignarle la altura y la anchura del jframe al jpanel,pero me da error, agradecería mucho la ayuda ya que he llegado a un punto en el que soy incapaz de avanzar, tengo 3 clases,la del jframe,la del jpanel(con una imagen) y la principal, quiero que ese jpanel vaya de fondo y luego agregar otro con una imagen que vaya en medio


lo que quiero hacer es esto (enseño el ejemplo con paint porque obviamente no lo consigo hacer en java. tener 2 imagenes en 2 jpanel distintos, y que al darle a run salgan las dos y que si amplio la ventana las dos sigan en el mismo sitio ocupando el mismo espacio:
que este así:
http://imagizer.imageshack.us/a/img673/8572/c1KNyD.jpg
y que cuando amplie la ventana siga en el mismo sitio todo
http://imagizer.imageshack.us/a/img904/9180/Ci8dZ6.jpg


clase del JFrame:


import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.Timer;



public class PantallaInicio2 extends JFrame implements ComponentListener{
Imagenes imagenes;
Timer time;
TimerTask tiempo;
int width;
int height;
public PantallaInicio2(){

this.setBounds(0,0,450,450);
this.setTitle("ventana");
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
this.setVisible(true);

Imagenes imagenes=new Imagenes();


Container contener=getContentPane();
contener.add(imagenes);

Dimension windowSize = this.getContentPane().getSize();
width = size().width;
height = size().height;


contener.addComponentListener(this);



System.out.println("Width "+width+("Height "+height));
this.add(imagenes);
if (width<450){

System.out.println("chivato if "+width);







}


}
public void componentResized(ComponentEvent e) {

if (e.getComponent().getWidth() > 450){

width=e.getComponent().getWidth();
height=e.getComponent().getHeight();
System.out.println("chivato listener "+width);
System.out.println("chivato listener "+height);
imagenes.alturap=width;
imagenes.anchurap=height;
}

}

@Override
public void componentMoved(ComponentEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void componentShown(ComponentEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void componentHidden(ComponentEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}



}




clase del jpanel:


import java.awt.FlowLayout;
import java.awt.Image;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Imagenes extends JPanel{

JLabel fondo;
public int ancho,alto,alturap,anchurap;
PantallaInicio2 pantallainicio;

public Imagenes(){



//imagen de fondo

fondo=new JLabel();
ancho=0;
alto=0;
alturap=450;
anchurap=450;

this.add(fondo);

this.setSize(anchurap,alturap);
this.setLayout(new FlowLayout());

fondo.setIcon(ajustarImagen("fondopez.jpg"));
fondo.setBorder(BorderFactory.createEmptyBorder(0, 0,0,0));

}

private ImageIcon ajustarImagen(String ico){

ImageIcon auxfondo=new ImageIcon(ico);
//escalar imagen
ancho=this.getWidth();
alto=this.getHeight();

ImageIcon tauxfondo=new ImageIcon(auxfondo.getImage().getScaledInstance(an cho,alto,Image.SCALE_DEFAULT));

return tauxfondo;

}
}






clase principal:

public class Principal2{

public static void main(String[]args){

PantallaInicio2 ventana=new PantallaInicio2();



}


}
  #2 (permalink)  
Antiguo 16/11/2014, 00:02
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

Hola,

Cita:
Iniciado por dr4 Ver Mensaje
... lo que intento es crear una imagen de fondo que crezca y se encoja con la ventana, conseguí hacerlo sin problemas usando un borderlayout y asignandole center pero es problema es que luego quiero agregarle otra imagen que esté en el centro pero no ocupe toda la pantalla(por encima del fondo de pantalla) y que esa imagen también crezca y se encoja con la ventana, he usado un listener que me avise de la anchura y la altura de la ventana en todo momento y he tratado de asignarle la altura y la anchura del jframe al jpanel,pero me da error, ...
Posiblemente, estás ocultando una variable,
Código:
Imagenes imagenes=new Imagenes();
En ese caso estás ocultando la variable imágenes al redefinirla, para eliminar el error solamente no la definas de nuevo.
Código:
imagenes=new Imagenes();
Y de allí puedes continuar.

Adicionalmente, aunque es posible hacer lo que estás pensando, usando un Layout null, va a ser muy complicado. Java tiene mecanismos mas simples para hacer lo que deseas.

Puedes usar un OverlayLayout (básicamente un null Layout), o un LayeredPane, o posiblemente puedes usan un GlassPane, aunque no esté en el fondo realmente la imagen podrías usarlo si no va a poner mas componentes. En el peor y mas complicado de los casos puedes hacer un LayoutManager.

El problema está en que todos esos métodos van a ser mucho mas complicados que simplemente hacer un @Override del método paint() del JFrame y con el método drawImage() del parámetro Graphics que recibes pintar las dos imágenes, una sobre otra, cambiándole el tamaño la segunda vez.

Por ejemplo:
Código Java:
Ver original
  1. @Override
  2.     public void paint(Graphics g) {
  3.         super.paint(g);
  4.         Graphics2D g2 = (Graphics2D) g;
  5.         g2.drawImage(image, 0, 0, getWidth(), getHeight(), rectangle.x, rectangle.y, rectangle.width, rectangle.height, this);
  6.         g2.drawImage(image, 100, 100, getWidth() - 100, getHeight() - 100, rectangle.x, rectangle.y, rectangle.width, rectangle.height, this);
  7.     }
En donde image es la imagen que obtuviste de algún lado y rectangle su tamaño con x, y, w, h.

Saludos,

Última edición por HackmanC; 16/11/2014 a las 00:10
  #3 (permalink)  
Antiguo 16/11/2014, 07:11
dr4
 
Fecha de Ingreso: noviembre-2014
Mensajes: 28
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

eres mi salvador!! no podía ni dormir bien con lo que me estaba costando, ha quedado perfecto, ahora seguiré experimentando porque quiero hacerlo con distintas clases y Jpanels,espero no tener ningún problema. Gracias una vez mas
  #4 (permalink)  
Antiguo 16/11/2014, 10:22
dr4
 
Fecha de Ingreso: noviembre-2014
Mensajes: 28
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

una duda mas, como pongo un evento de botón para que me dibuje la ultima imagen solo si pulso el botón? he puesto el action listener alrededor del g.draw pero simplemente no ocurre nada, este es mi código con el boton pero sin el actionlistener ya que no sé donde debería ponerlo

package dobleimagen;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
*
* @author Paulo
*/
public class DobleImagen extends JFrame {

public Image imagendefondo,ruleta;
public URL fondo,rueda;
JPanel pboton;
JButton reto,jb1;

public DobleImagen() throws InterruptedException{
this.setBounds(0,0,400,400);
this.setTitle("ventana");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
this.setLocationRelativeTo(null);



fondo=this.getClass().getResource("/imagenes/imagen.jpg");
imagendefondo=new ImageIcon(fondo).getImage();



rueda=this.getClass().getResource("/imagenes/rulketagif.gif");
ruleta=new ImageIcon(rueda).getImage();

Container contener=getContentPane();

contener.add(panel);


this.setVisible(true);
Dimension windowSize = this.getContentPane().getSize();
int width = size().width;
int height = size().height;


System.out.print("height"+height);
System.out.print("width"+width);

this.add(panel);


}
public JPanel panel=new JPanel(){

JButton reto = new JButton("reto");
ActionListener ActionEvent;
public void paintComponent(Graphics g){




g.drawImage(imagendefondo,0,0,getWidth(),getHeight (),this);
setOpaque(false);
panel.add(reto);
reto.setMargin(new Insets(30, 30, 30, 30)); //dimensiones boton
g.drawImage(ruleta,100,100,getWidth()-200,getHeight()-200,panel);


}

};

public static void main(String[] args) throws InterruptedException {

DobleImagen ventana=new DobleImagen();




}
}
  #5 (permalink)  
Antiguo 16/11/2014, 12:01
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

Hola,

Cita:
Iniciado por dr4 Ver Mensaje
una duda mas, como pongo un evento de botón para que me dibuje la ultima imagen solo si pulso el botón? he puesto el action listener alrededor del g.draw pero simplemente no ocurre nada, este es mi código con el boton pero sin el actionlistener ya que no sé donde debería ponerlo
...
Lo aconsejable sería que tienes que implementar una variable booleana a nivel del objeto, si la variable está en true entonces pintas la imagen, sino pues no.

Algo así:
Código Java:
Ver original
  1. private boolean flag = true;
  2. ...
  3. @Override
  4. private void paint(...) {
  5.   if (flag) {
  6.     g.drawImage(...);
  7.   }
  8. }

Y en el evento del botón, cambias esa variable a true o false dependiendo de la lógica que le quieras dar. El evento del botón se asigna al botón propiamente.

Algo así:

Código Java:
Ver original
  1. boton.addActionListener(new ActionListener() {
  2.   @Override
  3.   public actionPerformed(ActionEvent event) {
  4.     flag = !flag;
  5.     repaint();
  6.   }
  7. }
Saludos,

Última edición por HackmanC; 16/11/2014 a las 12:06
  #6 (permalink)  
Antiguo 16/11/2014, 12:28
dr4
 
Fecha de Ingreso: noviembre-2014
Mensajes: 28
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

lo imaginaba, muchas gracias por tu tiempo
  #7 (permalink)  
Antiguo 16/11/2014, 14:11
dr4
 
Fecha de Ingreso: noviembre-2014
Mensajes: 28
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

el problema esta totalmente resuelto tanto de boton como de imagen, he avanzado mucho mas en un día que en 2 semanas, pero siento curiosidad por algo que me ayudaría en la organización, como puedo hacer lo mismo pero teniendo los jpaneles en otra clase? me explico: ahora mismo estoy diciendole al jpanel (que esta en la misma clase del jframe) que al hacer el g.draw coja las medidas del jframe ( g.drawImage(imagendefondo,0,0,getWidth(),getHeight (),this); ) pero si esos paneles están en otra clase no puedo decirle a las imagenes que cojan las medidas del jframe que está en otra clase, hay alguna solución para esto?

imagino que lo que tengo que hacer es decirle a la imagen que coja la medida del jpanel, y luego al hacer panel.add en la clase del jframe decirle al panel que coja la medida del jframe, pero no sé muy bien como debería ser, todos los ejemplos que encuentro dan por hecho que el jpanel está en la misma clase que el jframe.
  #8 (permalink)  
Antiguo 16/11/2014, 18:59
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: tener 2 imagenes en 2 jpanels distintos una de fondo y la otra en medio

Cita:
Iniciado por dr4 Ver Mensaje
... como puedo hacer lo mismo pero teniendo los jpaneles en otra clase? me explico: ahora mismo estoy diciendole al jpanel (que esta en la misma clase del jframe) que al hacer el g.draw coja las medidas del jframe ( g.drawImage(imagendefondo,0,0,getWidth(),getHeight (),this); ) pero si esos paneles están en otra clase no puedo decirle a las imagenes que cojan las medidas del jframe que está en otra clase, hay alguna solución para esto?
...
Todo depende del Container, es decir, al hacer el @override del método paint() estas pintando el fondo del JFrame y no otra cosa. Si lo que deseas es pintar el fondo de un JPanel entonces no haces un @override del metodo paint() del JFrame, sino que haces un @override del metodo paintComponent del JPanel, para pintar el fondo del JPanel y no otra cosa.

Normalmente, calcular manualmente el tamaño de un componente en reacción de algún evento como por ejemplo componentResize no es buena idea, para eso sirven los LayoutManager, hacen todos los calculos necesarios para redimensionar los componentes correctamente en el momento correcto, que no es cualquier momento.

Saludos,

Etiquetas: clase, distintos, imagenes, medio, string, tener
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:02.