Scale displayed Image via JCheckBox

VansCat

Mitglied
Hello everyone,
Ich bin eine Java Studentin, meine Deutschkenntnisse ist so so... Ich brauche hilfe bei der Einsendeaufgaben:
Ich weiß nicht was soll ich bei dem Listener machen und was noch verändern.
Bitte haben Sie etwas Geduld mit mir, ich bin nur studentin.
Wenn Sie mir tipps geben könnten, wäre das echt super, danke schonmal im vorraus!

Das Kontrollkästchen Anpassen im Register Einzelbild des Bildbetrachters wirkt
sich nur auf die Anzeige der Grafiken aus, die noch geladen werden. Ändern Sie
das Programm so, dass über das Kontrollkästchen auch das aktuell angezeigte Bild
angepasst werden kann.
Wie Sie diese Änderung umsetzen, bleibt Ihnen überlassen. Dokumentieren Sie
Ihre Lösung aber bitte ausführlich,

Java:
import java.io.File;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;

public class BildbetrachterDialog {
	
	class MeinFilter extends FileFilter {

		@Override
		public boolean accept(File f) {
			
			String name = f.getName().toLowerCase();
			if (f.isDirectory())
				return true;
			if (name.endsWith(".gif"))
				return false;
			if (name.endsWith(".jpg"))
				return true;
			if (name.endsWith(".jpeg"))
				return true;
			if (name.endsWith(".png"))
				return true;
			return false;
		}
		

		
		@Override
		public String getDescription() {
			return "Grafikdateien"; 
			
			}
	}
	
	private JFileChooser dialogErstellen(){
		FileFilter filter = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg");
		JFileChooser oeffnenDialog = new JFileChooser();
	
		 oeffnenDialog.addChoosableFileFilter(filter);
		
		oeffnenDialog.setFileFilter(new MeinFilter());
		
		oeffnenDialog.setAcceptAllFileFilterUsed(false);
		
		return oeffnenDialog;
	}

	
	public String dialogZeigen() {
		JFileChooser dialogEinzel;
		dialogEinzel = dialogErstellen();
		
	
		int status = dialogEinzel.showOpenDialog(null);
		
		if (status == JFileChooser.APPROVE_OPTION)
			return (dialogEinzel.getSelectedFile().toString());
	
		else 
			return null;
	}
	
	//die Methode für die Auswahl mehrerer Dateien
	public File[] dialogZeigenMehrere() {
		JFileChooser dialogMehrere;
		dialogMehrere = dialogErstellen();
		dialogMehrere.setMultiSelectionEnabled(true);
		
		//den Dialog anzeigen und den Status holen
		int status = dialogMehrere.showOpenDialog(null);
		
		if (status == JFileChooser.APPROVE_OPTION)
			return (dialogMehrere.getSelectedFiles());
		
		else 
			return null;
	}
}

Java:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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{
	
	//automatisch über Eclipse ergänzt
	private static final long serialVersionUID = 5926848670766709720L;

	private JButton oeffnen, beenden, oeffnenSchau, beendenSchau;

	private JTextField eingabe;
	
	private BildPanel bildAnzeige, bildAnzeigeSchau;
	
	private JCheckBox skalieren;
	
	//adding the JSpinner 
	private JSpinner jspinner; 
	private int showImage;

	
	//The inner class for the listener
	class MeinListener implements ActionListener, ChangeListener { //must import change listener and itemListener

		@Override
		public void actionPerformed(ActionEvent e) {
			//für die Schaltflächen zum Beenden
			if (e.getActionCommand().equals("Ende"))
				System.exit(0);
			//für die Auswahl eines einzelnen Bildes
			if (e.getActionCommand().equals("Laden")) 
				bildLaden();
			//für die Auswahl der Bilder für die Bilderschau
			if (e.getActionCommand().equals("LadenSchau")) 
				bilderSchau();
			
		
		}
		public void stateChanged (ChangeEvent e){ //must import change event 
			if (e.getSource() instanceof JSpinner){
				showImage = (Integer) jspinner.getValue();
				try {
					Thread.sleep(showImage * 1000); //must double the number mili second 
				} catch (InterruptedException e1){
					e1.printStackTrace(); 			} 	}
			//What do I need to change or add here? 
			if (e.getSource() instanceof JCheckBox){
			//	bildAnzeigeSchau.grafikLaden(nameOfTheLastDatei, skalieren.isSelected()); 
			}
					
		}
	}
			
	//der Konstruktor
	public Bildbetrachter(String titel) {
		super(titel);
		initGUI();
	}
	
	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();
		
		//create the componenets 
		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);
		
		//link the listener 
		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.LEFT));
		registerSchau.add(bildAnzeigeSchau);
		
		oeffnenSchau = new JButton("Bilder laden");
		beendenSchau = new JButton("Beenden");
		oeffnenSchau.setActionCommand("LadenSchau");
		
		beendenSchau.setActionCommand("Ende");
		//crate a label for the jspinner 
		JLabel label = new JLabel ("Anzeige Dauer");
		//create and add the spinner number model
		SpinnerNumberModel numbermodel = new SpinnerNumberModel (10,2,20,1); //must import spinner number model 
		jspinner = new JSpinner (numbermodel);
		registerSchau.add(oeffnenSchau);
		registerSchau.add(beendenSchau);
		registerSchau.add(label); //add the label and the spinner to the register 
		registerSchau.add(jspinner);
		
		//link the Listener 
		oeffnenSchau.addActionListener(listener);
		beendenSchau.addActionListener(listener);
		//link the change listener to the spinner and JCheckBox
		jspinner.addChangeListener (listener);
		skalieren.addChangeListener (listener);

		panelKomplett.add("Einzelbild",registerEinzel);
		panelKomplett.add("Bilderschau",registerSchau);
		
		add(panelKomplett);
		
		setSize(350,450);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	
	private void bildLaden() {
		
		BildbetrachterDialog dialog = new BildbetrachterDialog();
		
		String datei = dialog.dialogZeigen();
		
		if (datei != null) {
			bildAnzeige.grafikLaden(datei, skalieren.isSelected());
			eingabe.setText(datei); } }
	
	//die Methode zur Anzeige der Bilderschau
	private void bilderSchau() {
		//einen Standard-Öffnen-Dialog erzeugen
		BildbetrachterDialog dialogSchau = new BildbetrachterDialog();
		//die Rückgabe holen und in einem Array vom Typ File ablegen 
		File[] dateien = dialogSchau.dialogZeigenMehrere();
		
		//wenn eine Datei ausgewählt wurde, alle Dateien nacheinander anzeigen
		if (dateien != null) {
			for (File datei: dateien) {
				bildAnzeigeSchau.grafikLaden(datei.toString(), true); }}}

			public static void main(String[] args) {
				new Bildbetrachter("Bildbetrachter");
		
	}
}

Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

//The class create a Panel with the image uploaded 

public class BildPanel extends JPanel{
	
	private static final long serialVersionUID = 7482508662820162216L;
	
	//Create a bufferedImage object for the input image 
	private BufferedImage bild;
	

	//for the change of the image 
	private double neueBildBreite;
	private double neueBildHoehe;
	
	
	//The constructor that set the size, draws a box and retrieve the graphics context
	public BildPanel() {
		setPreferredSize(new Dimension(300,300));
		setBorder(new BevelBorder(BevelBorder.LOWERED));
	}
	
	//The method to upload the image, the name of the file is passed as a String 
	//scaled controls whether the image is resized or not
	
	public void grafikLaden(String datei, boolean skaliert) {
		
		//A local variable for the change of the proportion
		double proportion;
				
		try { //the exception handling is mandatory 
			//inputimage bild 
			bild = ImageIO.read(new File(datei));
			
			//Should the image be adjusted? 
			if (skaliert == true) {
				
				//Is the image height is higher that the width (height >  width)
				if (bild.getHeight() > bild.getWidth())
					
					//then we determine the best new height
					proportion = (double) this.getSize().height / bild.getHeight();
				else
					//otherwise the optimal width 
					proportion = (double) this.getSize().width / bild.getWidth();
			}
			else
				//if not, the proportion remains unchanged
				proportion = 1.0;
			
			//Calculate the new height and width 
			//Must be instance variable double 
			//Resizes an image by a percentage of original size (proportional).
			neueBildBreite = proportion * bild.getWidth();
			neueBildHoehe = proportion * bild.getHeight();
			
			//Get the graphic context 
			Graphics grafikKontext = this.getGraphics();
			
			//Clear the display
			grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
			
			//The method drawImage to show the new output scaled image   
			grafikKontext.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
		}
		catch (IOException e) { //Error resize image 
			JOptionPane.showMessageDialog(this.getParent(), "Beim Laden hat es ein Problem gegeben", "Fehler", JOptionPane.ERROR_MESSAGE);
		}
	}

	//Override the method so that the resize image will not disappear 
	@Override
	protected void paintComponent(Graphics g) {
		//Call the parent method that resize the image  
		super.paintComponent(g);
		//When an image is displayed, let it resize
		if (bild != null)
			g.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
	}
}
 
In der Klasse BildPanel würde ich die Methode grafikLaden in zwei Methoden aufteilen:
void bildLaden(String datei)
void bildSkalieren(boolean skaliert)
In der Methode bildSkalieren musst du am Anfang prüfen, ob überhaupt ein Bild geladen wurde (Prüfung ob bild == null)

Wenn im ActionListener das ActionCommand gleich "Anpassen" ist musst du die Methode bildSkalieren aufrufen:
Java:
if ( e.getActionCommand().equals( "Anpassen" ) ) {
  bildAnzeige.bildSkalieren( skalieren.isSelected() );
}
 

Zurück
Oben