ImageIcon in JLabel verkleinern

Status
Nicht offen für weitere Antworten.
M

markussch

Gast
Hallo zusammen

Ich habe ein kleines Layout mit dem GridBagLayout-Manager aufgebaut. Das Ganze in einem JFrame. Funktioniert soweit auch ganz gut.
In einer Zelle befindet sich ein JLabel mit einem ImageIcon. Verkleinere ich nun das JFrame werden die Komponenten schön verkleinert, das JLabel aber nicht (da es ja die Grösse haben muss wegen des Bildes). Ich möchte nun allerdings das Bild ebenfalls verkleinern. Wie stelle ich dies am besten an? Muss ich einen ComponentListener anlegen und dann verkleinern oder gibt es einen einfacheren Weg?
 

L-ectron-X

Gesperrter Benutzer
Über eine Verhältnisberechnung (Länge, Breite des Fensters in Ausgangszustand).
In dem Maße, wie sich das Fenster in seiner Größe verändert, skalierst du das Bild auf deinem JLabel.
 
M

markussch

Gast
OK. Aber wo und wann? Eigentlich könnte ich es folgendermassen machen:

Code:
public class Test extends JPanel {
		ImageIcon test;
		public Test() {
			test=new ImageIcon("test.png");
			JLabel testen=new JLabel(test);
			this.setLayout(new GridBagLayout());
			GridBagConstraints eins=new GridBagConstraints();
			eins.gridx=0;
			eins.gridy=0;
			this.addComponentListener(new Listener());
			add(testen,eins);
		}
		public void GUI (){
			JFrame fenster=new JFrame ();
			fenster.setSize (800,600);
			fenster.setResizable(true);
			fenster.setTitle ("testen");
			fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			fenster.setContentPane(new Test());
			fenster.setVisible(true);
		}
		public ImageIcon groesse_anpassen(){
			Image original = test.getImage();
			Image scaled = original.getScaledInstance(this.getWidth()/5, this.getHeight()/5, Image.SCALE_SMOOTH);
			return new ImageIcon(scaled);
		}
		public static void main (String[] args) {
			new Test().GUI();
		}
	class Listener extends ComponentAdapter{
		public void componentResized(ComponentEvent e) {
			removeAll();
			add(new JLabel(groesse_anpassen()));
		}
	}
	

}

Aber gibt es nicht noch eine elegantere Methode? Ich habe mit der obigen folgende Probleme:
1. Das Bild wird zuerst gar nicht angezeigt, erst nach einigen resizes am Fenster.
2. Die Berechnung ist ziemlich langsam.
 
G

Guest

Gast
Ich habe leider keine Antwort auf deine Frage, aber wollte mal etwas zu deinem Code fragen.
Erst mal vielen Dank für die ImageIcon-Resize-Funktion! Habe gegoogelt und immer sehr umständliche Realisierungen (wie z.B. diese http://au.answers.yahoo.com/answers2/frontend.php/question?qid=20080327223212AAz04yG) gefunden (vielleicht hilft dir das ja auch)).
Jedenfalls habe ich mal deinen Resizecode übernommen und habe jetzt Schwierigkeiten, wenn ich schon direkt beim JFrame-Aufruf ein Bild aus meiner Datenbank laden und setzen will. Ich möchte nämlich das Bild so groß wie ein bestimmtes Label und ein Panel machen und beziehe daher die Scalewerte mit panel.getHeight/Width.
Beim Aufruf des JFrames und Resizen haben die Komponenten ja noch eine Höhe und Breite von 0, daher klappt das halt nicht. Jetzt ist die Frage, wie ich an die Größe schon beim ersten Aufruf komme? Ein updateUI() und repaint() und dann Abfragen der Größen liefert auch ein 0.
Wenn das JFrame schon steht ist es natürlich dann kein Problem ein ImageIcon entsprechend vernünftig auf das Label/Pabel zu sizen.
 
M

markussch

Gast
Ich bin nicht sicher, ob ich deine Frage richtig verstanden habe, aber warum baust du nicht zuerst das JFrame auf und setzt dann das ImageIcon drauf? Wenn es um die Verzögerung geht, könntest du z.B. zuerst das Frame initialisieren usw., dann das Icon hinzufügen und erst am Schluss mit setVisible sichtbar machen.
 

p3lotud0

Aktives Mitglied
Hi,

sorry, dass ich erst jetzt antworte: Zuerst das JFrame aufbauen und dann das ImageIcon setzen? Wie mache ich das denn?

Habe ne öffentliche Methode geschrieben, die das ImageIcon setzt. Dann das JFrame aufgerufen und hinterher aus der Klasse, die das JFrame aufgerufen hat seine Methode zum Icon-Setzen aufgerufen. Trotzden bekomme ich in der Methode jeweils 0 für die Rückgabewerte des JPanels oder JLabels.

Wenn ich im besagten JFrame einen Button mit der Funktion des Icon-Setzens mache ist das ganze kein Problem...

Mhmm...
 

Tom299

Bekanntes Mitglied
du könntest auch selbst eine ImageIcon-Klasse ableiten und getWidth und getHeight überschreiben, z.b.:

Code:
public class CategoryIcon extends ImageIcon {

    // icon color
    private Color iconColor = null;
    private boolean paintIcon = true;
    
    
    public CategoryIcon (Color iconColor) {
        super ();
        this.iconColor = iconColor;        
    }
    
    public CategoryIcon () {
        super ();
        this.paintIcon = false;
    }
    
    @Override
    public synchronized void paintIcon (Component c, Graphics g, int x, int y) {        
        if (paintIcon) {
            g.setColor (this.iconColor);
            g.fillRect (1, 1, getIconWidth () - 2, getIconHeight () -2);            
        }
    }
    
    @Override
    public int getIconHeight () {        
        return 16;
    }
    
    @Override
    public int getIconWidth () {
        return 16;
    }
}

ich meinem beispiel zeichne ich ein rechteck und hab die größe auf 16x16 festgelegt, aber das kann man ja auch dynamisch berechnen lassen (z.b. anhand der label-höhe in deinem fall)
 

p3lotud0

Aktives Mitglied
Erstmal danke für den Code. Das setzen von einer festen Größe ist ja kein Thema. Da brauch mal ja auch nicht extra ne abgeleitete Klasse für. Das Problem ist ja, dass es dynamisch sein soll und das ich halt, wenn ich die Größe des Labels abfrage, immer 0 zurückbekomme. Irgendwie muss die GUI des JFrames dafür erst stehen. Wenn das der Fall ist, macht meine Methode schon eine flexible Größe für das ImageIcon abhängig von der Größe des Labels.
Ich bekomme es einfach nicht hin, die Methode dann aufzurufen, wenn das Label schon entsprechend eine Größe besitzt, obwohl ich das JFrame schon zeichne und danach (jedenfalls meiner Meinung nach) die SetzeImageIcon-Methode extern aufrufe...
Vielleicht reden wir jetzt auch aneinander vorbei, dann entschuldige bitte :)
 
G

Gast

Gast
Hi,
habe hier noch eine schöne Lösung gefunden.

http://forum.java.sun.com/thread.jspa?threadID=5244163&messageID=10006657

JPfoto.add(new JLabel(new ImageIcon("Your Image")) {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(((ImageIcon)getIcon()).getImage(), 0, 0, getWidth(), getHeight(), null);
}
});

Kann noch modiv. werden mit render hints um die Qualli des Bildes zu bestimmen.

Gruß Mirco
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
S JLabel mit ImageIcon, komischer Rahmen? AWT, Swing, JavaFX & SWT 2
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
S JLabel zeigt ImageIcon nicht AWT, Swing, JavaFX & SWT 13
badfish Swing ImageIcon auf JLabel, Fenster Maximieren verbieten und Icon oben links austauschen? AWT, Swing, JavaFX & SWT 5
W ImageIcon im JLabel mit autosize? AWT, Swing, JavaFX & SWT 3
S n-e-w JLabel(n-e-w ImageIcon(i)) funkt. nicht im JScrollPane AWT, Swing, JavaFX & SWT 2
G JLabel und ImageIcon AWT, Swing, JavaFX & SWT 16
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
L ImageIcon auf JPanel wird nicht angezeigt(keiner Fehlermeldung) AWT, Swing, JavaFX & SWT 11
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
Tausendsassa ImageIcon?! Hilfe! AWT, Swing, JavaFX & SWT 10
O ImageIcon lädt nicht AWT, Swing, JavaFX & SWT 2
kaoZ Swing JToolBar, ImageIcon werden teilweise verdeckt AWT, Swing, JavaFX & SWT 0
R ImageIcon - Über Socket AWT, Swing, JavaFX & SWT 1
P ImageIcon lade schlägt fehl AWT, Swing, JavaFX & SWT 5
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
C Swing ImageIcon mit Bild aus Temp-Verzeichniss füllen AWT, Swing, JavaFX & SWT 15
P ImageIcon auf Rectangle AWT, Swing, JavaFX & SWT 3
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
A Swing ImageIcon hover AWT, Swing, JavaFX & SWT 9
M ImageIcon Bild wird beim verkleinern des Fensters nicht verkleinert AWT, Swing, JavaFX & SWT 3
B Swing ImageIcon Resizing AWT, Swing, JavaFX & SWT 15
S ImageIcon von Label entfernen AWT, Swing, JavaFX & SWT 9
B Warten bis neues ImageIcon zugewiesen ist AWT, Swing, JavaFX & SWT 3
Zettelkasten imageIcon-Rand wegmachen AWT, Swing, JavaFX & SWT 5
S Abspeichern aus einem ImageIcon ins korrekte Format AWT, Swing, JavaFX & SWT 2
J ImageIcon: ZipException bei ungültiger PNG-Datei AWT, Swing, JavaFX & SWT 2
S ImageIcon Grösse anpassen AWT, Swing, JavaFX & SWT 2
J Geladene Grafik in ImageIcon auf Panel fest positionern. AWT, Swing, JavaFX & SWT 8
B Problem mit imageIO und ImageIcon AWT, Swing, JavaFX & SWT 5
M Swing ImageIcon über JFileChooser einbinden AWT, Swing, JavaFX & SWT 4
C Swing JComboBox - Problem bei Darstellen von ImageIcon AWT, Swing, JavaFX & SWT 4
G ImageIcon viel zu groß AWT, Swing, JavaFX & SWT 2
G IMageIcon Bildgröße ändern AWT, Swing, JavaFX & SWT 7
isowiz Leeres ImageIcon einer bes timmten Größe erzeugen AWT, Swing, JavaFX & SWT 2
B ImageIcon JFrame AWT, Swing, JavaFX & SWT 3
M ImageIcon auf AbstractButton links-/rechtbündig AWT, Swing, JavaFX & SWT 2
D jButton mit ImageIcon & MouseListener AWT, Swing, JavaFX & SWT 5
M Problem, an ImageIcon in JPanels zu kommen. AWT, Swing, JavaFX & SWT 2
J Bildfilterung und Ausgabe in ein ImageIcon AWT, Swing, JavaFX & SWT 2
X ImageIcon für JButton AWT, Swing, JavaFX & SWT 4
X JButton "effect" für ImageIcon AWT, Swing, JavaFX & SWT 6
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T ImageIcon als Seperator im Jmenu AWT, Swing, JavaFX & SWT 8
padde479 ImageIcon laden AWT, Swing, JavaFX & SWT 6
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
J ImageIcon, Image - 100% CPU Auslastung . AWT, Swing, JavaFX & SWT 3
B imageicon relativer Pfad AWT, Swing, JavaFX & SWT 5
F ImageIcon Größe ändern AWT, Swing, JavaFX & SWT 29
M ImageIcon / .paintIcon() AWT, Swing, JavaFX & SWT 2
M Problem mit ImageIcon in einer JTable AWT, Swing, JavaFX & SWT 2
D JButton einen neuen ImageIcon setzen? AWT, Swing, JavaFX & SWT 2
R resize ImageIcon AWT, Swing, JavaFX & SWT 7
B Problem mit ImageIcon/Swing in Linux AWT, Swing, JavaFX & SWT 6
K ImageIcon fehler ? AWT, Swing, JavaFX & SWT 4
M ImageIcon laden? AWT, Swing, JavaFX & SWT 2
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C Swing Übergabe von String an JLabel AWT, Swing, JavaFX & SWT 9
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
D JLabel übereinanderlegen AWT, Swing, JavaFX & SWT 5
E JLabel kopieren AWT, Swing, JavaFX & SWT 31
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
J Swing JLabel Verknüpfung aktualisieren AWT, Swing, JavaFX & SWT 3
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
E JLabel AWT, Swing, JavaFX & SWT 1
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
L JLabel ist verzerrt/größer als eingestellt AWT, Swing, JavaFX & SWT 15
B Observer Pattern JLabel ändern AWT, Swing, JavaFX & SWT 7
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L Kalendar als JLabel einfügen AWT, Swing, JavaFX & SWT 3
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
P Aktualisierung von jLabel in jFrames AWT, Swing, JavaFX & SWT 8
DaCrazyJavaExpert Swing JLabel Klickanimation AWT, Swing, JavaFX & SWT 4
A Swing JLabel als Parameter übergeben AWT, Swing, JavaFX & SWT 9
M JLabel ausrichten AWT, Swing, JavaFX & SWT 2
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben