Foto skalieren

Status
Nicht offen für weitere Antworten.

kaper28

Bekanntes Mitglied
Hallo leute,

Mein checkbox anpassen reagiert nur wenn ich vor dem bild laden anklicke, aber ich möchte das es nach dem ich das bild geladen habe auch die bilder skaliert. Habe versucht , habe es bischen hinbekommen aber nicht wie ich es will .Kann mir einer einen tip geben ?

Code:
package betrachter;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Bildbetrachter extends JFrame {

	// für die Schaltflächen
	private JButton oeffnen, beenden, oeffnenSchau, beendenSchau;
	// für die Eingabe
	private JTextField eingabe;
	// für die Anzeige
	private BildPanel bildAnzeige, bildAnzeigeSchau;
	// für die Anpassung
	private JCheckBox skalieren;
	private JSpinner drehfeld;
	private JLabel anzeige;
	private int anzeigeDauer;

	// die innere Klasse mit dem Listener
	class MeinListener implements ActionListener, ChangeListener {

		@Override
		public void actionPerformed(ActionEvent e) {

			if (e.getActionCommand().equals("Ende"))
				System.exit(0);

			if (e.getActionCommand().equals("Laden"))
				BildLaden();
			

			

			if (e.getActionCommand().equals("LadenSchau"))
				bilderschau();

			
				

		}

		public void stateChanged(ChangeEvent e) {

			if (e.getSource() instanceof JSpinner) {
				anzeigeDauer = (Integer) drehfeld.getValue();

				try {
					Thread.sleep(anzeigeDauer * 1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

			}

		}
	}

	// der Konstruktor
	public Bildbetrachter(String titel) {
		super(titel);
		initGUI();

	}

	public void grafikLaden() {
		// TODO Auto-generated method stub

	}

	// die Methode zum Erstellen der Oberfläche
	private void initGUI() {
		// die Panels für die Register
		JPanel registerEinzel = new JPanel();
		JPanel registerSchau = new JPanel();

		// das TabbedPane
		JTabbedPane panelKomplett = new JTabbedPane();

		// das Register für die Einzelanzeige
		// eine neue Instanz für das Panel mit der Grafik erzeugen
		bildAnzeige = new BildPanel();

		// die Komponenten erstellen und einbauen
		registerEinzel.setLayout(new FlowLayout(FlowLayout.LEFT));
		registerEinzel.add(bildAnzeige);

		oeffnen = new JButton("Bild laden");
		beenden = new JButton("Beenden");

		oeffnen.setActionCommand("Laden");
		beenden.setActionCommand("Ende");

		eingabe = new JTextField(20);

		skalieren = new JCheckBox("Anpassen");

		registerEinzel.add(new JLabel("Bilddatei: "));
		registerEinzel.add(eingabe);
		registerEinzel.add(skalieren);

		registerEinzel.add(oeffnen);
		registerEinzel.add(beenden);

		// die Listener verbinden
		MeinListener listener = new MeinListener();

		oeffnen.addActionListener(listener);
		beenden.addActionListener(listener);
		skalieren.addActionListener(listener);
		// das Register für die Bilderschau
		// eine neue Instanz für das Panel mit der Grafik erzeugen

		bildAnzeigeSchau = new BildPanel();

		// die Komponenten erstellen und einbauen
		registerSchau.setLayout(new FlowLayout(FlowLayout.CENTER));
		registerSchau.add(bildAnzeigeSchau);

		oeffnenSchau = new JButton("Bilder laden");
		beendenSchau = new JButton("Beenden");
		oeffnenSchau.setActionCommand("LadenSchau");

		JLabel label = new JLabel("Anzeige Dauer");

		SpinnerNumberModel modell = new SpinnerNumberModel(5, 0, 10, 1);
		drehfeld = new JSpinner(modell);
		drehfeld.addChangeListener(listener);

		// die Schaltfläche zum Beenden bekommt dasselbe ActionCommand wie im
		// anderen Register
		beendenSchau.setActionCommand("Ende");

		registerSchau.add(label);
		registerSchau.add(drehfeld);
		registerSchau.add(oeffnenSchau);
		registerSchau.add(beendenSchau);

		// die Listener verbinden

		oeffnenSchau.addActionListener(listener);
		beendenSchau.addActionListener(listener);

		// und nun alles zusammenbauen

		panelKomplett.add("Einzelbild", registerEinzel);
		panelKomplett.add("Bilderschau", registerSchau);

		add(panelKomplett);

		// Größe setzen, anzeigen, keine Größenänderungen zulassen und
		// Standard-Verhalten festlegen
		setSize(360, 450);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	// die Methoe zum laden eine bildes über den Dialog-fenster
	private void BildLaden() {
		
		
		// einen standart dialog erzeugen
		BildbetrachterDialog dialog = new BildbetrachterDialog();

		// die rückgabe holen
		String datei = dialog.dialogZeigen();
		// wenn eine datei ausgewählt wurde laden
		
		bildAnzeige.grafikLaden(datei, skalieren.isSelected());
		
			
			
	}

	
	// die methode zur anzeige der Bilderschau
	private void bilderschau() {
		// einen standart dialog erzeugen
		BildbetrachterDialog dialogSchau = new BildbetrachterDialog();

		// die rückgabe holen und in einem Array von typ file legen

		File[] datein = dialogSchau.dialogZeigenMehrere();

		// wenn eine datei ausgewählt wurde alle zeigen

		if (datein != null) {
			for (File datei : datein) {
				bildAnzeigeSchau.grafikLaden(datei.toString(), true);

			}

		}
	}
}

Hbae noch hier eine andere Klasse die mir das bild skaliert
Code:
public void grafikLaden(String datei, boolean skaliert) {
		//eine lokale Variable für die Änderung der Proportionen
		double proportion;
		
		//die Ausnahmebehandlung ist zwingend erforderlich
		try {
			bild = ImageIO.read(new File(datei));
			//soll das Bild angepasst werden?
			if (skaliert == true) {
				//ist das Bild höher als breit?
				if (bild.getHeight() > bild.getWidth())
					//dann ermitteln wir die optimale neue Höhe
					proportion = (double) this.getSize().height / bild.getHeight();
				else
					//sonst die optimale neue Breite
					proportion = (double) this.getSize().width / bild.getWidth();
			}
			else
				//wenn nicht, bleibt die Proportion unverändert
				proportion = 1.0;
			//die "neue" Breite und Höhe berechnen
			//die Variablen müssen als Instanzvariablen vom Typ double vereinbart werden
			neueBildBreite = proportion * bild.getWidth();
			neueBildHoehe = proportion * bild.getHeight();
			//den Grafik-Kontext beschaffen
			Graphics grafikKontext = this.getGraphics();
			//die Anzeige löschen
			grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
			//das Bild anzeigen
			//dabei wird die neue Höhe und Breite berücksichtigt
			grafikKontext.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
		}
		catch (IOException e) {
			JOptionPane.showMessageDialog(this.getParent(), "Beim Laden hat es ein Problem gegeben", "Fehler", JOptionPane.ERROR_MESSAGE);
		}
	}

	//die Methode zum Neuzeichnen überschreiben, damit die Bilder nicht verschwinden
	@Override
	protected void paintComponent(Graphics g) {
		//die Methode zum Neuzeichnen der übergeordneten Klasse aufrufen, damit es keine Probleme gibt
		super.paintComponent(g);
		//wenn ein Bild angezeigt wurde, neu zeichnen lassen
		if (bild != null)
			g.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
	}
}
 
In der actionPerformed von "MeinListener" muss noch sowas rein wie

if (e.getSource().equals(skalieren)) bildAnzeigeSchau.grafikLaden(nameDerLetztenGeladenenDatei, skalieren.isSelected());

Ansonsten ist der Code sehr unübersichtlich und unaufgeräumt......... :noe:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben