2010-02-11 10 views
15

Ho caricato un'immagine nella GUI che viene visualizzata su una JLabel. La dimensione dell'etichetta è impostata su 100.100 mentre l'immagine è molto più grande, quindi quando la carica nell'etichetta si espande.Java ImageIcon size

Esiste comunque la possibilità di ridimensionare automaticamente le dimensioni dell'etichetta?

Di seguito si riporta l'ascoltatore d'azione per l'upload delle immagini 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()); 

risposta

5

Certo, basta eseguire l'override del metodo paintComponent e si può scalare e dipingere come volete.

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

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

Fonte da here.

EDIT

Per aggiungere alla vostra modifica del codice:

lblDisPic = new JLabel(); 

A:

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

scusa, sto avendo problemi a capire cosa fa una classe interiore anamorosa, puoi dirmi come lo realizzo? – sutoL

+0

Ho aggiornato la risposta con come è possibile implementarla. – Pool

+0

e la mia actionListener class UploadHandler? – sutoL

25

Dato il codice di esempio, un approccio è quello di ridimensionare l'immagine da visualizzare sul JLabel prima che venga chiamato il metodo setIcon.

Un modo potrebbe essere quello di cambiare il metodo actionPerformed, quindi l'immagine sarà caricata dal file specificato, utilizzando ImageIO.read metodo per leggere l'immagine, quindi ridimensionare l'immagine prima di creare un ImageIcon.

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

Poi, l'immagine caricata può essere ridimensionata alla dimensione del JLabel, utilizzando Image.getScaledInstance.

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

Ora, si potrebbe creare un ImageIcon da utilizzare sul JLabel.

lblDisPic.setIcon(new ImageIcon(resizedImage)); 

La limitazione di questo metodo è che se il JLabel viene ridimensionato in qualsiasi modo, quindi l'immagine contenuta dal JLabel non saranno ridimensionate. Tuttavia, poiché lo JLabel utilizzerà un'immagine ridimensionata dell'originale, significherebbe che la quantità di memoria richiesta sarebbe ridotta (se si tratta di una preoccupazione) e l'immagine originale non dovrebbe essere ridimensionata ogni volta che l'immagine viene visualizzata visualizzato, come sarebbe il caso con l'override del metodo paintComponent.

Il metodo preferito per il raggiungimento del compito in corso dipende dai requisiti se l'immagine originale sarà necessaria in un secondo momento o meno.

+0

ciao, sì l'immagine deve essere nuovamente necessaria per visualizzare le informazioni della persona. – sutoL

+7

Credo che il null debba essere sostituito con Image.SCALE_FAST (o una qualsiasi delle sue varianti enumerate). – sdasdadas

+0

Oppure 'Image.SCALE_SMOOTH' che tenta di ridimensionare l'immagine in modo più fluido (Docu dice:' Scegli un algoritmo di ridimensionamento dell'immagine che dia maggiore priorità alla levigatezza dell'immagine rispetto alla velocità di ridimensionamento.) –

2

Si poteva ignorare il metodo paintIcon sull'icona stessa -

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... 
    } 

}; 

Edit -

mi sono reso conto che la dimensione originale dell'immagine viene preso in considerazione quando l'etichetta decide dove posizionare la x , y posizione dell'icona. Avrai bisogno di sovrascrivere anche i metodi getIconWidth() e getIconHeight().

Tuttavia, non c'è un buon modo per ignorare questi per restituire la dimensione dell'etichetta, in quanto non vi è alcun riferimento al componente stesso all'interno di questi metodi.

Un approccio potrebbe essere quello di creare una nuova classe che estenda ImageIcon e passare il componente in - non una grande scelta perché questo interrompe gli aspetti "riutilizzabili tra molti componenti" di un'icona.

Un altro sarebbe semplicemente sovrascrivere questi metodi nella classe interna come sopra, ma inserire un riferimento hardcoded al componente come campo oggetto o come variabile locale final. Di nuovo, questo rompe l'aspetto "riutilizzabile tra molti componenti", e sembra un po '"hacky" in generale, ma dato che è una classe interiore una tantum, questo potrebbe essere permissibile.

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

questo mostrerà il componente filechooser e imposterà il percorso di immagine in jTextField1 e mostra l'immagine usando setIcon ... e ridimensiona l'immagine in valori predefiniti .... quindi l'immagine non viene ritagliata e sbagliata. – Rohit

+0

niente di nuovo rispetto alle risposte precedenti, c'è ;-) – kleopatra

1

Se è possibile modificare l'immagine in vernice quindi impostare la sua dimensione di conseguenza in vernice e quindi fare clic su salvare e quindi della stessa dimensione dell'immagine verrà a l'applicazione Java.