2010-02-11 15 views
15

He cargado una imagen en mi GUI que se muestra en un JLabel. La dimensión de etiqueta está configurada solo 100,100 mientras que la imagen es mucho más grande, por lo que cuando la subo a la etiqueta se expande.Java ImageIcon tamaño

¿Hay algún modo para que cambie automáticamente el tamaño de la etiqueta?

A continuación se muestra el oyente de acción para el Subir imagen JButton

class UploadHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     int returnVal = fc.showOpenDialog(frame2); 
     file = fc.getSelectedFile(); 
     pathname = file.getPath(); 
     icon = new ImageIcon(pathname); 
     lblDisPic.setIcon(icon);  
    } 
} 

btnUpload = new JButton("Upload Picture"); 
lblDisPic = new JLabel(); 
lblDisPic.setBorder(raisedetched); 
lblDisPic.setPreferredSize(d); 

btnUpload.addActionListener(new UploadHandler()); 

Respuesta

5

Claro, sólo reemplazar el método paintComponent y se puede escalar y pintar a su gusto.

myLabel = new JLabel (/*whatever*/) { 

    @Override 
    public void paintComponent (Graphics g) { 
     super.paintComponent (g); 
     g.drawImage (myImageIcon.getImage(), 0, 0, getWidth(), getHeight(), null); 
    } 
}; 

Fuente de here.

EDITAR

Para agregar a su cambio de código:

lblDisPic = new JLabel(); 

Para:

lblDidPic = new JLabel() { 

    @Override 
    public void paintComponent (Graphics g) { 
     super.paintComponent (g); 
     if (icon != null) { 
      g.drawImage (icon.getImage(), 0, 0, getWidth(), getHeight(), null); 
     } 
    } 
}; 
+0

lo siento, tengo problemas para entender lo que hace una clase interna anónima ¿me puede decir cómo lo implemento? – sutoL

+0

He actualizado la respuesta con la forma en que podría implementarlo. – Pool

+0

¿qué pasa con mi actionListener class UploadHandler? – sutoL

25

Teniendo en cuenta el código de ejemplo, un enfoque consiste en cambiar el tamaño de la imagen que se mostrará en la JLabel antes de llamar al método setIcon.

Una forma podría ser cambiar el método actionPerformed, por lo que la imagen se carga desde el archivo especificado, utilizando ImageIO.read método para leer la imagen, a continuación, cambiar el tamaño de la imagen antes de crear un ImageIcon.

Image img = ImageIO.read(fc.getSelectedFile()); 

Entonces, la imagen cargada puede ser redimensionado a la dimensión de la JLabel, utilizando Image.getScaledInstance.

Image resizedImage = 
    img.getScaledInstance(lblDisPic.getWidth(), lblDisPic.getHeight(), null); 

Ahora, se podría crear un ImageIcon a utilizar en la JLabel.

lblDisPic.setIcon(new ImageIcon(resizedImage)); 

La limitación de este método es que, si el JLabel se cambia el tamaño de ninguna manera, a continuación, la imagen contenida por el JLabel no cambiar de tamaño. Sin embargo, como el JLabel va a utilizar una imagen reducida del original, significaría que la cantidad de memoria requerida se reduciría (si eso fuera una preocupación) y la imagen original no tendría que cambiar de tamaño cada vez que se está creando una imagen. mostrado, como sería el caso al anular el método paintComponent.

El método preferido para lograr la tarea en cuestión va a depender de los requisitos de si la imagen original se va a necesitar en otro momento o no.

+0

hola, sí, la imagen será necesaria nuevamente para mostrar la información de la persona. – sutoL

+7

Creo que el nulo debe reemplazarse con Image.SCALE_FAST (o cualquiera de sus variantes enumeradas). – sdasdadas

+0

O 'Image.SCALE_SMOOTH' que intenta escalar la imagen con mayor suavidad (Docu dice:' Elija un algoritmo de escalado de imagen que dé mayor prioridad a la suavidad de la imagen que la velocidad de escalado.) –

2

Usted podría reemplazar el método paintIcon en el icono de sí mismo -

ImageIcon icon = new ImageIcon(...) { 

    @Override 
    public void paintIcon(Component c, Graphics g, int x, int y) { 
     g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); 
    } 

    @Override 
    public int getIconHeight() { 
     // see below... 
    } 

    @Override 
    public int getIconWidth() { 
     // see below... 
    } 

}; 

Editar -

me di cuenta de que el tamaño original de la imagen se toma en cuenta cuando la etiqueta decide dónde colocar el x , y ubicación del icono. También deberá sobrescribir los métodos getIconWidth() y getIconHeight().

Sin embargo, no hay una buena manera de anular estos para devolver el tamaño de la etiqueta, ya que no hay ninguna referencia al componente en sí mismo dentro de estos métodos.

Un enfoque sería crear una nueva clase que extienda ImageIcon y pasar el componente; no es una gran opción porque esto rompe los aspectos "reutilizables entre muchos componentes" de un icono.

Otra sería anular estos métodos en la clase interna como se indicó anteriormente, pero poner una referencia codificada al componente como un campo de objeto, o como una variable local final. De nuevo, esto rompe el aspecto "reutilizable entre muchos componentes", y parece un poco "hacky" en general, pero como es una clase interna única, esto podría ser permisible.

0
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           

JFileChooser jFileChooser1=new JFileChooser(); 

int state = jFileChooser1.showOpenDialog(new JFrame());   
     jTextField1.setText(""); 

      if(state ==JFileChooser.APPROVE_OPTION) { 
     JOptionPane.showMessageDialog(
        null,null); 
     File file = jFileChooser1.getSelectedFile(); 
     s2=file.toString(); 
      jTextField1.setText(s2); 
     jLabel1=new JLabel(); 
    jLabel1.setName(s2); 
    jLabel1.setLocation(50,50); 
    jLabel1.setSize(300,300); 
    add(jLabel1); 

    BufferedImage bi1; 

    try 
    { 
     bi1=ImageIO.read(file); 
     ImageIcon icon1=new ImageIcon(bi1); 
     jLabel1.setIcon(icon1); 
     Image img = ImageIO.read(jFileChooser1.getSelectedFile()); 

     Image resizedImage = 
    img.getScaledInstance(jLabel1.getWidth(), jLabel1.getHeight(),Image.SCALE_DEFAULT); 
     jLabel1.setIcon(new ImageIcon(resizedImage)); 


    jLabel1.setBorder(BorderFactory.createLineBorder(Color.RED,5)); 


     pack(); 

    } 
    catch(Exception e) 
    { 
    System.out.println(e); 
    } 


    } 
    else if(state == JFileChooser.CANCEL_OPTION) { 
     JOptionPane.showMessageDialog(
        new JFrame(), "Canceled"); 
    } 
    pack();   

    } 
+0

esto mostrará el componente filechooser y establecerá la ruta de imagen en jTextField1 y mostrar imagen usando setIcon ... y cambiar el tamaño de la imagen a valores pedefined ... para que la imagen no se recorta y se vuelva incorrecta. – Rohit

+0

nada nuevo en comparación con respuestas anteriores, ¿verdad ?-) – kleopatra

1

Si usted puede editar la imagen en la pintura a continuación, establezca su tamaño en consecuencia en la pintura y luego haga clic en guardar y luego el mismo tamaño de la imagen se volverán a la aplicación Java.

Cuestiones relacionadas