Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > como poner una imagen pequeña?

muy buenas, estoy haciendo un trabajo que me esta costando, he puesto en un Jframe una imagen de fondo usando un BorderLayout/CENTER), ahora quiero en medio de la ventana (sin quitar la imagen de fondo) poner un gif mas pequeño, no tengo problemas en poner la imagen,pero quiero que al ampliarse la ventana la imagen del centro siga en su sitio y eso me está resultando imposible, he probado con algún otro layout pero siempre se mueve,solo está justo donde quiero cuando abro la aplicación.

si alguién me puede decir que layout puedo usar para que la imagen no se mueva de su sitio y decirme como ponerlo se lo agradecería mucho ya que llevo poco en esto y todos los tutoriales que encuentro hablan de los layouts usando botones nunca imagenes.

noviembre 12, 2014 | Unregistered Commenterdr4

Puedes poner ese GIF dentro de un JPanel o un JLabel.

noviembre 12, 2014 | Registered Commenterchoces

gracias por contestar, lo he hecho choces, abrí un jpanel puse la imagen etc, y la imagen al darle a run y abrirse la ventana me sale en el centro por las posición de x e y que le puse, hasta ahí todo bien, el problema es que la imagen no acompaña a la ventana cuando la expando, quedandose en un rincón, quisiera saber si hay alguna manera de poner la imagen donde yo quiera y que la imagen siempre se queda en el mismo sitio, que crezca cuando aumento la ventana y que disminuya cuando la haga mas pequeña, eso conseguí hacerlo con una imagen de fondo poniendo un borderlayout y asignandole el centro,pero quiero poder poner yo las coordenadas de la imagen y también su tamaño inicial y que siempre esté en medio de la ventana o en donde yo haya querido ponerla. (poniéndola en medio al poner pantalla completa la imagen se queda en un rincón ahora mismo)

noviembre 12, 2014 | Unregistered Commenterdr4

Se puede hacer lo que pretendes; sin embargo no es un asunto trivial.
Voy a analizar detenidamente el asunto, y cuando tenga un test preparado, lo publico aquí.

noviembre 12, 2014 | Registered Commenterchoces

te agradezco el esfuerzo, seguí buscando por mi cuenta y saque esto

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

pensé que así consigo un numero para aplicarle a la imagen como para decirle: "si width o height aumentan tu aumentas esa misma cantidad de numeros o viceversa" ya que width y height son el tamaño de la ventana, pero aunque lo intenté no supe aplicarlo de manera efectiva, en unos intentos no pasaba nada y en otros la imagen se volvía loca.

noviembre 12, 2014 | Unregistered Commenterdr4

Solo es un test rápido, que no hace exactamente lo que quieres; pero creo que te dará las ideas para lograrlo con facilidad.
La clave está en el ComponentListener: una vez que al redimensionar el JFrame obtienes su nueva anchura y altura, ya puedes calcular la posición del JPanel que desees, con el nuevo tamaño que quieras, y ya puedes ajustar la imagen a voluntad

import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

/**
<p>
@author Carlos Hoces
*/
public class NewJFrame extends javax.swing.JFrame {

private int frameWidth;
private int frameHeight;

/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
addComponentListener(new ComponentListenerImpl());
}

/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jPanel1 = new javax.swing.JPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Panel interno"));

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(278, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(166, Short.MAX_VALUE))
);

pack();
}// </editor-fold>

/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}

// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration

private class ComponentListenerImpl implements ComponentListener {

@Override
public void componentResized(ComponentEvent e) {
frameWidth = getWidth();
frameHeight = getHeight();
jPanel1.setSize(frameWidth - jPanel1.getWidth(), frameHeight - jPanel1.getHeight());
}

@Override
public void componentMoved(ComponentEvent e) {

}

@Override
public void componentShown(ComponentEvent e) {

}

@Override
public void componentHidden(ComponentEvent e) {

}
}
}

noviembre 13, 2014 | Registered Commenterchoces

lo mirare ahora con calma, gracias por preocuparte

noviembre 14, 2014 | Unregistered Commenterdr4

he conseguido poner el listener de la ventana y para verificarlo puse un system.out.println que me dice el width y el height de la ventana, me va diciendo sin problemas cuanto mide la ventana en cada momento, pero cuando quiero que ponga esas medidas en el jpanel de la imagen me salta un error muy largo,creo que no puede entrar a la clase del jpanel y cambiar su ancho y su alto,pondré aquí las clases que he creado así como el error por si puedes ayudarme a localizar en que me estoy equivocando:

CLASE 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;
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);



}
public void componentResized(ComponentEvent e) {

height=e.getComponent().getHeight() ;
width=e.getComponent().getWidth();

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

imagenes.setSize(width- imagenes.getWidth(),height - imagenes.getHeight());
}

@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 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,20,20));

}

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(ancho,alto,Image.SCALE_DEFAULT));

return tauxfondo;

}
}



---------------------------------------------------------------------------------------------------------------


CLASE PRINCIPAL

public class Principal2{

public static void main(String[]args){

PantallaInicio2 ventana=new PantallaInicio2();



}


}

---------------------------------------------------------------------------------------------------------------

EL ERROR:

at java.awt.Component.processComponentEvent(Component.java:6351)
at java.awt.Component.processEvent(Component.java:6305)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

noviembre 15, 2014 | Unregistered Commenterdr4

En la excepción completa debe haber una línea con la referencia a una clase de tu código, y a la línea de código desde donde se lanza esa excepción.
Necesito saber qué línea es esa.

noviembre 16, 2014 | Registered Commenterchoces

lo logré, al final era mucho mas sencillo de lo que pensaba, simplemente al dar la orden de dibujar la imagen debajo podía dibujar otra con otras medidas y listo, así hasta el infinito y poniéndolas donde yo quiera , dejo el codigo por si le puede ser de utilidad a alguien, a mi me costó muchísimo encontrar una respuesta verdaderamente válida, de todas formas gracias por el esfuerzo y la paciencia.

el secreto está en drawImage que te permite dibujar la imagen donde quieras con las medidas que quieras.

(aqui llego a poner 3 imagenes, una de fondo, una en medio y otra en medio de esta ultima que al ser gifs crean un efecto muy chulo)


/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package aplicacionretos;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
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(){

public void paintComponent(Graphics g){
g.drawImage(imagendefondo,0,0,getWidth(),getHeight(),this);


g.drawImage(ruleta,50,50,getWidth()-100,getHeight()-100,this);

g.drawImage(ruleta,100,100,getWidth()-200,getHeight()-200,this);
}

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

DobleImagen ventana=new DobleImagen();




}
}

noviembre 16, 2014 | Unregistered Commenterdr4