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 ?
Hbae noch hier eine andere Klasse die mir das bild skaliert
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);
}
}