Bildgröße automatisch auf JLabel Größe konvertieren

Hallo an alle,

ich stehe vor folgendem Problem.

Ich mir ein paar Radiobuttons gemacht und ein JLabel. Jetzt möchte ich, je nachdem welcher RadioButton aktiviert ist ein unterschiedliches Bild in dem JLabel laden.

Das Problem ist, dass die Bilder unterschiedliche Größen haben.

Wenn ich nun ein Bild lade, dass größer ist als die Größe vom JLabel, wird nur ein Teil des Bildes angezeigt.

Gibt es irgendeine Möglichkeit, bei dem ich Java sagen kann, dass er das ganz Bild anzeigen soll?
Sollte so sein, dass er die Bildgröße automatisch auf die Größe des JLabel umkonvertiert.

Für die Lösung muss es nicht unbedingt ein JLabel sein. Was anderes habe ich momentan nicht gefunden was sich eignet.

Vielen Dank für eure Antworten.

LG euer,
Adraino Celentano
 

Nardian

Bekanntes Mitglied
ja, dazu gibts ne Möglichkeit: überschreibe einfach die paintComponent Methode von dem JLabel (oder was auch immer) dass dein bild anzeigen soll, und verwende die grapics.drawImage(img,x,y,w,h,imgObs) funktion, um das gegebene bild in einer neuen Größe zu zeichnen (je nachdem was du als w und h angibst)

MfG
 

bERt0r

Top Contributor
Du solltest code posten damit man da auch was dazu sagen kann. Schau ich geh mit gutem Beispiel voran:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;

public class LabelResize extends JFrame
{

    private JPanel contentPane;
    private JPanel panel;
    private JRadioButton rdbtnBild1;
    private JRadioButton rdbtnBild2;
    private JLabel label;
    private ImageIcon icon1,icon2;

    /**
     * Launch the application.
     */
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    try
                    {
                        LabelResize frame = new LabelResize();
                        frame.setVisible(true);
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            });
    }

    /**
     * Create the frame.
     */
    public LabelResize()
    {
        try
        {
            icon1=new ImageIcon(new URL("http://www.java-forum.org/images/misc/java_forum_org.gif"));
            icon2=new ImageIcon(new URL("http://www.java-forum.org/images/buttons/post_thanks.gif"));
        } catch (MalformedURLException e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 500, 300);
        contentPane = new JPanel();
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        panel = new JPanel();
        contentPane.add(panel, BorderLayout.SOUTH);


        label = new JLabel();
        label.setHorizontalAlignment(JLabel.CENTER);
        contentPane.add(label, BorderLayout.CENTER);

        ButtonGroup group=new ButtonGroup();

        rdbtnBild1 = new JRadioButton("Bild 1");
        rdbtnBild1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                label.setIcon(icon1);
                label.revalidate();
            }
        });
        panel.add(rdbtnBild1);
        group.add(rdbtnBild1);

        rdbtnBild2 = new JRadioButton("Bild 2");
        rdbtnBild2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                label.setIcon(icon2);
                label.revalidate();
            }
        });
        panel.add(rdbtnBild2);
        group.add(rdbtnBild2);

    }

}
[EDIT]@Nardian: Das halte ich für keine gute Idee. Die paintComponent ist zum Zeichnen da, nicht zum Größe verändern.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
PaintComponent von JLabel zu überschreiben könnte zu Problemen führen: Dort wird ja viel, viel mehr gemacht als nur das Bild zu zeichnen (Label text, neben/über/unter dem Bild abhängig vom Alignment, ausgegraut wenn label.setEnabled(false) usw...).

Ein spontaner Gedanke war eben, ob man statt des "normalen" ImageIcon dort vielleicht ein ImageIcon übergeben könnte, bei dem paintImage, getIconWidth und getIconHeight passend überschrieben sind - müßte man mal ausprobieren... Auch da könnte es noch haken, aber zumindest wäre das weit weniger "invasiv" als das Überschreiben von paintComponent aus JLabel.

Wenn das NUR eine Component sein sollte, die NUR ein Image malt, könnte das einfachste aber sein, sich dort eine spezielle ImageComponent zu machen - DORT wäre dann die paintComponent einfach so implementiert, wie oben angedeutet.
 
Hallo an alle,
danke für die Anregungen.

Ich habe nur ein einfaches JFrame implementiert, dass aus einem Vorgängerdialog dann neu instanziert wird. Hier sollen dann die Bilder im JLabel angezeigt werden.

Anbei der Code:

Java:
package Version16.JPanel.funktioniert.com;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JRadioButton;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Gegner extends JFrame {

	private JPanel contentPane;

	public Gegner() {
		setTitle("W\u00E4hle einen Gegner");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 217);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JRadioButton rdbtnCountDooku = new JRadioButton("Count Dooku");
		rdbtnCountDooku.setBounds(10, 57, 109, 23);
		contentPane.add(rdbtnCountDooku);
		
		JRadioButton rdbtnDarthMaul = new JRadioButton("Darth Maul");
		rdbtnDarthMaul.setBounds(10, 83, 109, 23);
		contentPane.add(rdbtnDarthMaul);
		
		JRadioButton rdbtnDarthVader = new JRadioButton("Darth Vader");
		rdbtnDarthVader.setBounds(10, 109, 109, 23);
		contentPane.add(rdbtnDarthVader);
		
		JRadioButton rdbtnDarthSodi = new JRadioButton("Darth Sidious");
		rdbtnDarthSodi.setBounds(10, 137, 109, 23);
		contentPane.add(rdbtnDarthSodi);
		
		JLabel lblWhleDeinenDunklen = new JLabel("W\u00E4hle deinen dunklen Gegenspieler");
		lblWhleDeinenDunklen.setBounds(10, 11, 422, 23);
		contentPane.add(lblWhleDeinenDunklen);
		
		JButton btnWeiter = new JButton("Weiter");
		btnWeiter.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				CreatingField2 frame = new CreatingField2();
				frame.setVisible(true);
				frame.setLocationRelativeTo(null);
				close();
			}
		});
		btnWeiter.setBounds(6, 167, 91, 23);
		contentPane.add(btnWeiter);
		
		JPanel panel = new JPanel();
		panel.setBounds(209, 11, 205, 168);
		contentPane.add(panel);
		panel.setLayout(new GridLayout(1, 0, 0, 0));
		setLocationRelativeTo(null);
	}
	public void close() {
		this.dispose();
	}
}

Sorry aber den letzten Eintrag habe ich nicht ganz überrissen. Wie soll das gehen.

LG euer,

Adriano Celentano
 

bERt0r

Top Contributor
Meine Kristallkugel hats vorher ja schon geflüstert, ich wollts nicht ansprechen. Null Layout ist BÖSE. Lerne wie man mit Layoutmanagern umgeht, dann passen sich deine Labels von selber an. Von mir aus guck dir auch den link in meiner Sig an, da siehst du wieviel Arbeit du dir ersparen kannst.
 
Hallo an Marco13 & bERt0r,

erstmals Danke für eure Antworten. @ bERt0r Upps... da habe ich bei dir wohl einen Wundenpunkt erwischt ;)
Naja, war nicht mit Absicht. Das Layout war nur schnell gemacht und hatte eigentlich nichts mit meinem Problem zutun.
revalidate() nütz mir da leider nichts.

Mein Problem ist dieses:
Ich habe ein JLabel mit einer fixen Größe (z.B. breite 150, höhe 150). Die Bilder die ich laden möchte haben alle unterschiedliche Größen (z.B. breite 450, höhe 250). Jetzt werden mir exakt nur die 150x150 von dem Bild in meinem JLabel angezeigt--> also eine Eck davon.
Naja, schaut nicht gerade schön aus.

Jetzt wollte ich wissen, ob es eine Möglichkeit gibt, das gesamte Bild in das JLabel reinzuquetschen?

Anbei mein neuer Code... diesesmal mit einem Layoutmanager der nicht null ist.... ;)
Java:
package Version16.JPanel.funktioniert.com;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Gegner2 extends JFrame {

	private JPanel contentPane;

	public Gegner2() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		final JLabel lblNewLabel = new JLabel("");
		JLabel label = new JLabel("W\u00E4hle deinen dunklen Gegenspieler");
		contentPane.add(label, BorderLayout.NORTH);
		
		JPanel panel = new JPanel();
		contentPane.add(panel, BorderLayout.WEST);
		panel.setLayout(new GridLayout(0, 1, 0, 0));
		
		JRadioButton rdbtnNewRadioButton = new JRadioButton("New radio button");
		rdbtnNewRadioButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				lblNewLabel.setIcon(new ImageIcon("C:\\Users\\CELEAN\\workspace\\Project Schiffe versenken\\src\\Version16\\JPanel\\funktioniert\\com\\Bilder\\count_dookus_1.jpg"));
			}
		});
		panel.add(rdbtnNewRadioButton);
		
		JRadioButton rdbtnNewRadioButton_2 = new JRadioButton("New radio button");
		panel.add(rdbtnNewRadioButton_2);
		
		JRadioButton rdbtnNewRadioButton_3 = new JRadioButton("New radio button");
		panel.add(rdbtnNewRadioButton_3);
		
		JRadioButton rdbtnNewRadioButton_1 = new JRadioButton("New radio button");
		panel.add(rdbtnNewRadioButton_1);
		
		JPanel panel_1 = new JPanel();
		contentPane.add(panel_1, BorderLayout.CENTER);
		panel_1.setLayout(new GridLayout(1, 0, 0, 0));
		

		panel_1.add(lblNewLabel);
	}

}

@Marco13 ja mit diesem JFrame möchte man es sich nicht anlegen....

Nochmals herzlichen Dank für eure Antworten.

LG
Adriano Celentano
 

Marco13

Top Contributor
Dann sag endlich was du willst, und poste Code der zur Frage passt. Geht es nur darum, ein Bild in einer bestimmten Größe anzuzeigen? Schreib' dir eine ImageComponent, die das macht. Soll es unbedingt ein Label sein? Das kann man vielleicht mit einem passend überschriebenen ImageIcon erreichen...

Angebrachter crap:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

class ScalingImageIcon extends ImageIcon
{
    private int w;
    private int h;

    ScalingImageIcon(String fileName, int w, int h)
    {
        super(fileName);
        this.w = w;
        this.h = h;
    }

    @Override
    public int getIconHeight()
    {
        return h;
    }

    @Override
    public int getIconWidth()
    {
        return w;
    }

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

public class Gegner2 extends JFrame {

    private JPanel contentPane;


    public static void main(String args[])
    {
        new Gegner2().setVisible(true);
    }

    public Gegner2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel(null);
        setContentPane(contentPane);

        final JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(200,100,100,100);

        JRadioButton rdbtnNewRadioButton = new JRadioButton("New radio button");
        rdbtnNewRadioButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                lblNewLabel.setIcon(new ScalingImageIcon("276.jpg",100,100));
            }
        });
        contentPane.add(rdbtnNewRadioButton);
        rdbtnNewRadioButton.setBounds(0,0,200,100);

        contentPane.add(lblNewLabel);
    }

}
 
Hallo Marco13,
war nicht meine Absicht mich so undeutlich auszudrücken.
Dein Code-Vorschlag hat jedenfalls wunderbar so funktioniert.
Vielen Dank.
LG
Adriano-Celentano
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Bildgröße Java Basics - Anfänger-Themen 17
S Bildgröße ermitteln & setSize() übergeben Java Basics - Anfänger-Themen 6
N Bildgröße Java Basics - Anfänger-Themen 8
K Bildgröße eines ImageIcon verändern Java Basics - Anfänger-Themen 2
M Bildgröße (in Byte) eines Images ermitteln Java Basics - Anfänger-Themen 2
H Automatisch Folgen? Java Basics - Anfänger-Themen 1
T TextField Breite automatisch gebunden Java Basics - Anfänger-Themen 8
S Personalnummer automatisch generieren Java Basics - Anfänger-Themen 11
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
J CMD schließt sich automatisch Java Basics - Anfänger-Themen 5
P Arrays "automatisch" erstellen lassen Java Basics - Anfänger-Themen 12
I Klassen Eine ArrayList<Long>, die sich automatisch sortiert Java Basics - Anfänger-Themen 20
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
P Array wird automatisch überschrieben Java Basics - Anfänger-Themen 3
D Ich suche nach einer Möglickeit den Webseiten Inhalt per Java zu analysieren Automatisch Java Basics - Anfänger-Themen 3
F Interface JFrame mit if-Abfrage automatisch schließen lassen? Java Basics - Anfänger-Themen 3
J Leerzeichen im Pfad automatisch erkennen Java Basics - Anfänger-Themen 30
S Dialogfeld nach 5 Sek automatisch öffnen Java Basics - Anfänger-Themen 15
D Einer Variable automatisch Zahlen hinzuaadieren Java Basics - Anfänger-Themen 3
JavaNewbie2.0 Tausende Wörter in Arrays automatisch einfügen Java Basics - Anfänger-Themen 10
D Best Practice Objekt automatisch im Konstruktor füllen? Java Basics - Anfänger-Themen 9
I Automatisch Verzeichnis erstellen bei File erstellen Java Basics - Anfänger-Themen 5
J Sequenz diagram automatisch erstellen / Ablaufdiagramm Java Basics - Anfänger-Themen 0
G Alle Objekte und Variablen automatisch ausgeben Java Basics - Anfänger-Themen 7
A Klassen welche Klassen importiert Eclipse automatisch Java Basics - Anfänger-Themen 2
N Sequenzdiagamm automatisch erstellen Java Basics - Anfänger-Themen 1
S JComboBox automatisch füllen Java Basics - Anfänger-Themen 3
B Erst lesen: Automatisch Texteingabe bestätigen Java Basics - Anfänger-Themen 6
K Methoden Automatisch nach unten scrollen Java Basics - Anfänger-Themen 2
W Variablen Automatisch static? Java Basics - Anfänger-Themen 3
M Automatisch hoch zählen Java Basics - Anfänger-Themen 8
R eine Methode automatisch wiederholen Java Basics - Anfänger-Themen 12
H Regulären Ausdruck automatisch erstellen Java Basics - Anfänger-Themen 5
Viktormk java - int wert automatisch einlesen Java Basics - Anfänger-Themen 8
S Methode automatisch invoked Java Basics - Anfänger-Themen 4
E JTextArea beim Schreiben automatisch vergrößern Java Basics - Anfänger-Themen 7
S OOP Objekte automatisch erzeugen Java Basics - Anfänger-Themen 13
S Mehrere Objekte einer Klasse automatisch erzeugen Java Basics - Anfänger-Themen 15
D Automatisch zweidimensionale Arrays durchiterieren Java Basics - Anfänger-Themen 2
D Letztes Änderungs-Datum als Version automatisch eintragen Java Basics - Anfänger-Themen 5
A Downcast automatisch? Java Basics - Anfänger-Themen 17
T methode mehrfach automatisch ausfuehren Java Basics - Anfänger-Themen 6
M Vererbung Objekt automatisch einem Set zuordnen... Java Basics - Anfänger-Themen 7
A Input/Output Datei automatisch erstellen. Java Basics - Anfänger-Themen 29
T Varibalen automatisch in Schleife erstellen oder anderen Lösungsvorschlag Java Basics - Anfänger-Themen 18
ruutaiokwu properties values automatisch escapen ??? Java Basics - Anfänger-Themen 3
J eclipse kommentar nicht automatisch löschen Java Basics - Anfänger-Themen 3
T Datenbank automatisch erzeugen beim ersten Start Java Basics - Anfänger-Themen 6
M JFrame automatisch ausrichten Java Basics - Anfänger-Themen 3
G Variablen automatisch erstellen.. Java Basics - Anfänger-Themen 4
J Dateien automatisch per Mail versenden Java Basics - Anfänger-Themen 3
G Ampel automatisch umschalten Java Basics - Anfänger-Themen 18
E Mehrdimensionales Array automatisch befüllen Java Basics - Anfänger-Themen 9
P OOP Automatisch neue Objekte erstellen Java Basics - Anfänger-Themen 14
S Eingabe über Scanner einlesen und automatisch beenden Java Basics - Anfänger-Themen 11
M Datei automatisch erstellen Java Basics - Anfänger-Themen 5
H zustände speichern und beim erneuten programmstart zustände automatisch laden Java Basics - Anfänger-Themen 26
F JAVA_HOME automatisch setzen? Java Basics - Anfänger-Themen 2
X Programm beim Systemstart automatisch ausführen Java Basics - Anfänger-Themen 2
M String und Int Werte automatisch erstellen Java Basics - Anfänger-Themen 5
S UML mit Eclipse automatisch erstellen Java Basics - Anfänger-Themen 5
M Threads automatisch erzeugen Java Basics - Anfänger-Themen 10
X Errechte Werte automatisch in einem Array speichern Java Basics - Anfänger-Themen 11
T Variablennamen automatisch erstellen Java Basics - Anfänger-Themen 6
G Sonderzeichen automatisch ändern lassen Java Basics - Anfänger-Themen 23
J ImageIcon im JLabel automatisch resizen. Java Basics - Anfänger-Themen 6
J Automatisch Button drücken/Event ausführen? Java Basics - Anfänger-Themen 6
N Programm automatisch schließen Java Basics - Anfänger-Themen 3
M Swing Anwendung - boolean schaltet automatisch auf true Java Basics - Anfänger-Themen 2
L Lokale Variablen automatisch durch Schleife erzeugen Java Basics - Anfänger-Themen 2
L Sonderzeichen automatisch escapen. Java Basics - Anfänger-Themen 7
G JSP-Seite automatisch schließen Java Basics - Anfänger-Themen 4
G Eclipse startet automatisch Fenster. Java Basics - Anfänger-Themen 4
S Attribut beim erzuegen eines Objektes automatisch erhöhen Java Basics - Anfänger-Themen 6
G jtable, zeile automatisch hinzufügen Java Basics - Anfänger-Themen 3
E ScrollBar automatisch scrollen Java Basics - Anfänger-Themen 8
M Spaltengrößen automatisch anpassen mit POI Bibliothek ? Java Basics - Anfänger-Themen 4
M for-Schleife und Variablen automatisch durchlaufen Java Basics - Anfänger-Themen 2
P Automatisch auf die nächst höere zahl runden? Java Basics - Anfänger-Themen 7
J Leere Textfields automatisch mit einem Wert ausfüllen Java Basics - Anfänger-Themen 3
D Editor automatisch starten ? Java Basics - Anfänger-Themen 4
G Dem array automatisch werte von -10 bis +10 zuweisen Java Basics - Anfänger-Themen 6
G automatisch ausrechnen Java Basics - Anfänger-Themen 3
G automatisch speichern beim schliessen eines Spiels Java Basics - Anfänger-Themen 13
X Komponenten automatisch erzeugen Java Basics - Anfänger-Themen 8
X Viele Komponenten automatisch erzeugen Java Basics - Anfänger-Themen 2
A Punkte automatisch verbinden? Java Basics - Anfänger-Themen 3
K Object automatisch initialisiert? Java Basics - Anfänger-Themen 7
J Auf einem JLabel Linien Malen Java Basics - Anfänger-Themen 1
J neues Object (JLabel) vorab zum Layout hinzufügen , Location setzen, etc? Java Basics - Anfänger-Themen 2
J JLabel bzw. Image Icon mit KeyEvent bewgen Java Basics - Anfänger-Themen 9
GoenntHack Java Text von JLabel verändert sich nicht Java Basics - Anfänger-Themen 1
JUNSKI Zeilenumbruch JLabel Java Basics - Anfänger-Themen 1
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
S Mit for-Schleife ein 2D JLabel-Array mit veränderbaren Icons erstellen Java Basics - Anfänger-Themen 3
Tom/S JLabel Icon Farbe Java Basics - Anfänger-Themen 2
N Variabel in eine class mit "extends JLabel" übertragen Java Basics - Anfänger-Themen 2
S Kontrollieren, ob ein Jlabel nicht sichtbar ist Java Basics - Anfänger-Themen 6
S Input/Output JLabel verschieben Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben