Hallo,
ich habe einen Bilberachter, hier erst mal der Quelltext, damit jeder weiss worum es geht:
Das Programm laedt ein Bild ueber ein Dialog und zeigt es zu 300x300 Pixeln an, wenn man aber die CheckBox anklickt, soll das Bild angepasst werden d.h., wenn es groesser als 300x300Pixeln in seiner Originalgroesse ist, dann soll nicht nur ein Teil davon angezeigt werden, sondern das ganze verkleinert im Rahmen von 300x300 Pixeln angepasst.
Das Programm tut es problemlos, aber wenn man das Fenster aus dem Desktop hinausschiebt und wieder zurueck holt, dann verschwindet ein Teil des Bildes, wird quasie weg radiert.
Das sieht dann so aus:
Bild unangepasst, ein Teil davon also
Anhang anzeigen 1934
Bild wird hinausgeschoben.
Anhang anzeigen 1935
Bild wird wieder zurueck geholt und sieht so aus.
Anhang anzeigen 1936
Bild wird angepasst und wird ganz angezeigt, aber verkleinert, damit es in Rahmen von 300x300Pixeln passt.
Anhang anzeigen 1937
Bild wird hinausgeschoben und wenn es zurueckgeholt wird, sieht es aus wie in Bild drei, also ein Teil wegradiert, leider kann ich dieses Bild euch nicht mehr zeigen, weil nur 5 Bilder erlaubt hier.
Anhang anzeigen 1938
Warum wird ein Teil des Bildes wegradiert?:bahnhof:
Wie kann man das Problem beheben?:bahnhof:
ich habe einen Bilberachter, hier erst mal der Quelltext, damit jeder weiss worum es geht:
Java:
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class Bildbetrachter extends JFrame{
private static final long serialVersionUID = 1L;
private JButton oeffnen, beenden;
private JTextField eingabe;
private BildPanel variableTypBildPanel;
public JCheckBox skalieren;
private BufferedImage bild;
private double neueBildBreite;
private double neueBildHoehe;
class InnereKlasse implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Ende"))
System.exit(0);
if(e.getActionCommand().equals("Laden"))
bildLaden();
if(skalieren.isSelected()==true){
System.out.println("is selected");
variableTypBildPanel.bildAendernDirekt(skalieren.isSelected());
}
if(skalieren.isSelected()==false){
System.out.println("not selected");
variableTypBildPanel.bildAendernDirekt(skalieren.isSelected());
}
}//Ende Methode
}//Ende InnereKlasse
//Methode laedt Bild und uebergibt den Namen der Datei als Zeichenkette
public void bildLaden(String datei, boolean skaliert1){
double proportion;
try {
bild = ImageIO.read(new File(datei));
if (skaliert1 == true) {
if (bild.getHeight() > bild.getWidth())
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 unveraendert
proportion = 1.00;
//die "neue" Breite und Hoehe berechnen
neueBildBreite = proportion * bild.getWidth();
neueBildHoehe = proportion * bild.getHeight();
//den Grafik-Kontext beschaffen
Graphics grafikKontext = this.getGraphics();
//die Anzeige loeschen
grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
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);
}
}//Ende Methode bildLaden()
//Konstruktor
public Bildbetrachter(String titel){
super(titel);
variableTypBildPanel= new BildPanel();
//Layout vereinbaren
setLayout(new FlowLayout(FlowLayout.CENTER));
add(variableTypBildPanel);
oeffnen=new JButton("Bild laden");
beenden=new JButton("Beenden");
oeffnen.setActionCommand("Laden");
beenden.setActionCommand("Ende");
eingabe=new JTextField(30);
add(new JLabel("Bilddatei"));
add(eingabe);
skalieren = new JCheckBox("Anpassen");
add(skalieren);
add(oeffnen);
add(beenden);
//Listener verbinden
InnereKlasse InnereKlasse=new InnereKlasse();
oeffnen.addActionListener(InnereKlasse);
beenden.addActionListener(InnereKlasse);
skalieren.addActionListener(InnereKlasse);
setSize(450,450);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
//die Methode zum Laden eines Bildes ueber den Dialog
private void bildLaden() {
BildbetrachterDialog dialog = new BildbetrachterDialog();
String datei = dialog.dialogZeigen();
if (datei != null) {
variableTypBildPanel.grafikLaden(datei, skalieren.isSelected());
//den Namen der Datei im Eingabefeld anzeigen
eingabe.setText(datei);
}
}
}
Java:
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
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 true;
if(name.endsWith(".jpg"))
return true;
if(name.endsWith(".jpeg"))
return true;
if(name.endsWith(".png"))
return true;
return false;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return "Grafikdateien";
}
}//Ende innere Klasse
public String dialogZeigen(){
JFileChooser oeffnenDialog= new JFileChooser();
oeffnenDialog.setFileFilter(new MeinFilter());
oeffnenDialog.setAcceptAllFileFilterUsed(false);
int status=oeffnenDialog.showOpenDialog(null);
if(status==JFileChooser.APPROVE_OPTION)
return (oeffnenDialog.getSelectedFile().toString());
else
return null;
}
}
Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.io.IOException;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
public class BildPanel extends JPanel{
private static final long serialVersionUID = 1L;
private BufferedImage bild;
private double neueBildBreite;
private double neueBildHoehe;
//Konstruktor setzt Bildgroesse und Rahmen
public BildPanel(){
setPreferredSize(new Dimension(400,350));
setBorder(new BevelBorder(BevelBorder.LOWERED));
}//Ende Konstruktor
//Methode laedt Bild und uebergibt den Namen der Datei als Zeichenkette
public void grafikLaden(String datei, boolean skaliert){
System.out.println("Methode grafikLaden(), skaliert hat den Wert: "+skaliert);
double proportion;
//die Ausnahmebehandlung ist zwingend erforderlich
try {
bild = ImageIO.read(new File(datei));
if (skaliert == true) {
if (bild.getHeight() > bild.getWidth())
//dann ermitteln wir die optimale neue Hoehe
proportion = (double) this.getSize().height / bild.getHeight();
else
//sonst die optimale neue Breite
proportion = (double) this.getSize().width / bild.getWidth();
}
else
proportion = 1.00;
neueBildBreite = proportion * bild.getWidth();
neueBildHoehe = proportion * bild.getHeight();
Graphics grafikKontext = this.getGraphics();
//die Anzeige loeschen
grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
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);
}
}//Ende Methode bildLaden()
public void bildAendernDirekt(boolean skaliert){
double proportion2;
if (bild != null){
if (skaliert == true) {
System.out.println("Methode bildAendernDirekt! bild!=null ");
if (bild.getHeight() > bild.getWidth())
//dann ermitteln wir die optimale neue Hoehe
proportion2 = (double) this.getSize().height / bild.getHeight();
else
//sonst die optimale neue Breite
proportion2 = (double) this.getSize().width / bild.getWidth();
}
else
proportion2 = 1.00;
neueBildBreite = proportion2 * bild.getWidth();
neueBildHoehe = proportion2 * bild.getHeight();
Graphics grafikKontext = this.getGraphics();
grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
grafikKontext.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
}//Ende if-Abfrage fuer geladenes Bild
}
}//Ende Klasse BildPanel
Java:
public class BildbetrachterMain {
public static void main(String[] args) {
new Bildbetrachter("Bildbetrachter2");
}
}
Das Programm laedt ein Bild ueber ein Dialog und zeigt es zu 300x300 Pixeln an, wenn man aber die CheckBox anklickt, soll das Bild angepasst werden d.h., wenn es groesser als 300x300Pixeln in seiner Originalgroesse ist, dann soll nicht nur ein Teil davon angezeigt werden, sondern das ganze verkleinert im Rahmen von 300x300 Pixeln angepasst.
Das Programm tut es problemlos, aber wenn man das Fenster aus dem Desktop hinausschiebt und wieder zurueck holt, dann verschwindet ein Teil des Bildes, wird quasie weg radiert.
Das sieht dann so aus:
Bild unangepasst, ein Teil davon also
Anhang anzeigen 1934
Bild wird hinausgeschoben.
Anhang anzeigen 1935
Bild wird wieder zurueck geholt und sieht so aus.
Anhang anzeigen 1936
Bild wird angepasst und wird ganz angezeigt, aber verkleinert, damit es in Rahmen von 300x300Pixeln passt.
Anhang anzeigen 1937
Bild wird hinausgeschoben und wenn es zurueckgeholt wird, sieht es aus wie in Bild drei, also ein Teil wegradiert, leider kann ich dieses Bild euch nicht mehr zeigen, weil nur 5 Bilder erlaubt hier.
Anhang anzeigen 1938
Warum wird ein Teil des Bildes wegradiert?:bahnhof:
Wie kann man das Problem beheben?:bahnhof:
Zuletzt bearbeitet: