2010-02-11 16 views
15

Ich habe ein Bild in meine GUI hochgeladen, die auf einem JLabel angezeigt wird. Die Label-Dimension wird nur auf 100.100 gesetzt, während das Bild viel größer ist. Wenn ich es in das Label hochlade, wird es erweitert.Java ImageIcon Größe

Gibt es trotzdem eine automatische Größenanpassung an die Etikettengröße?

Unten ist die Aktion Listener für das Bild hochladen 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()); 

Antwort

5

Sicher, einfach überschreiben die paintComponent Methode und Sie können es skalieren und malen, wie Sie möchten.

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

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

Quelle von here.

EDIT

, um Ihren Code ändern hinzuzufügen:

lblDisPic = new JLabel(); 

An:

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

Sorry, ich habe ein Problem zu verstehen, was eine anoymous innere Klasse kann Sie mir sagen, wie kann ich es implementieren? – sutoL

+0

Ich habe die Antwort aktualisiert, wie Sie es implementieren könnten. – Pool

+0

Was ist mit meiner ActionListener-Klasse UploadHandler? – sutoL

25

der Beispielcode gegeben, ein Ansatz ist, die Größe des Bildes auf die angezeigt werden JLabel bevor die setIcon Methode aufgerufen wird.

Eine Möglichkeit könnte sein, die actionPerformed Methode zu ändern, so dass das Bild aus der angegebenen Datei geladen werden, mit ImageIO.read Methode das Bild zu lesen, bevor Sie die Bildgrößenänderung, bevor ein ImageIcon erstellt wird.

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

Dann kann das geladene Bild auf die Dimension der JLabel Größe verändert werden, Image.getScaledInstance verwenden.

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

Nun könnte man eine ImageIcon erstellen auf der JLabel zu verwenden.

lblDisPic.setIcon(new ImageIcon(resizedImage)); 

Die Beschränkung dieses Verfahrens ist, dass, wenn die JLabel in irgendeiner Weise geändert wird, dann ist die durch die JLabel enthaltene Bild wird nicht verändert werden. Da JLabel jedoch ein verkleinertes Bild des Originals verwendet, würde dies bedeuten, dass die erforderliche Speichermenge (falls dies ein Problem wäre) und das Originalbild nicht jedes Mal neu skaliert werden müsste, wenn das Bild gerade aufgenommen wird angezeigt, wie dies beim Überschreiben der paintComponent Methode der Fall wäre.

Die bevorzugte Methode zur Erledigung der Aufgabe hängt von den Anforderungen ab, ob das Originalbild zu einem späteren Zeitpunkt benötigt wird oder nicht.

+0

hallo, ja das Bild soll nochmal gebraucht werden um die Informationen der Person anzuzeigen. – sutoL

+7

Ich glaube, die Null sollte durch Image.SCALE_FAST (oder eine seiner aufgezählten Varianten) ersetzt werden. – sdasdadas

+0

Oder 'Image.SCALE_SMOOTH', das versucht, das Bild glatter zu skalieren (Docu sagt:' Wählen Sie einen Bildskalierungsalgorithmus, der der Glättung der Bilder eine höhere Priorität einräumt als die Skalierungsgeschwindigkeit.) –

2

Sie konnten die paintIcon Methode auf das Symbol außer Kraft setzen sich -

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

}; 

Bearbeiten -

Ich erkannte, dass die ursprüngliche Größe des Bildes berücksichtigt wird, wenn das Etikett entscheidet, wo die x platzieren , y Position des Symbols. Sie müssen auch die Methoden getIconWidth() und getIconHeight() überschreiben.

Es gibt jedoch keine gute Möglichkeit, diese zu überschreiben, um die Etikettengröße zurückzugeben, da innerhalb dieser Methoden kein Bezug zur Komponente selbst besteht.

Ein Ansatz wäre, eine neue Klasse zu erstellen, die ImageIcon erweitert und die Komponente übergeben - keine gute Wahl, weil dies die "wiederverwendbar zwischen vielen Komponenten" Aspekte eines Symbols durchbricht.

Eine andere Möglichkeit wäre, diese Methoden in der inneren Klasse wie oben zu überschreiben, aber eine fest codierte Referenz auf die Komponente als Objektfeld oder als lokale Variable final. Auch dies bricht den Aspekt "wiederverwendbar zwischen vielen Komponenten" und scheint im Allgemeinen ein wenig "hacky" zu sein, aber da es sich um eine einmalige innere Klasse handelt, könnte dies zulässig sein.

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

Dies zeigt die Dateichoooser-Komponente und den Pfad von Bild in jTextField1 und Anzeige Bild mit SetIcon .. und Größe des Bildes auf definierte Werte .... so Bild nicht abgeschnitten und falsch. – Rohit

+0

nichts neues im Vergleich zu früheren Antworten, ist da ;-) – kleopatra

1

Wenn Sie das Bild in Farbe dann seine Größe in Farbe entsprechend eingestellt bearbeiten und dann auf speichert und dann auf Ihre Java-Anwendung der gleiche Größe des Bildes kommen.