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
 
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
 
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:
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
 
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
 
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);
    }

}
 

Zurück
Oben