Swing Bild wird nicht mehr geladen

Alex2013

Bekanntes Mitglied
Hallo Leute,

bis vor zwei Tagen hat das Programm noch soweit funktioniert, dass ich Bilder speichern konnte und sie im Panel wieder anzeigen konnte. Nach einigen Änderungen (um das Programm zu verkleinern) wird das Bild jetzt aber nicht mehr auf dem Panel angezeigt. Die Methode zum Laden des BIldes habe ich nicht verändert. Ich habe es über einen Bufferedreader mit new File und Path versucht und über Image und ImageIcon.
Das gemalte Bild wird leider nicht mehr angezeigt. Allerdings wird auch keine Exception geworfen.
Ich habe den Verdacht, dass das Bild zwar angezeigt, aber durch irgendetwas übermalt wird. Ich wüsste aber nicht durch was...

Kann mir zufällig jemand den Fehler zeigen?
Dann kann ich ihn hofftl. selbst korrigieren.

Klasse MeinPaint:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;

public class MeinPaint extends JFrame {

    private static final long serialVersionUID = 1L;
    protected static final java.lang.String String = null;
    JFrame frame;
    JPanel hauptpanel,  buttonPanel, buttons2Panel;
            JLabel zeichnenPanel,bildDarstellen,bildname;
    JPanel zeichnen = new JPanel();

    static JButton malen, zeichnungenAnzeigen, annehmen;
    private BufferedImage bd;

    public MeinPaint() {
        // Das Hauptframe wird erstellt
        frame = new JFrame("Mein Paint Programm");
        frame.setSize(1000, 750);
        frame.setLocationRelativeTo(null);
        frame.setLayout(new BorderLayout());

        // Hierdrauf wird alles hinzugefügt
        Container c = frame.getContentPane();

        // Hier wird das Auswahlpanel angelegt
        hauptpanel = new JPanel();
        hauptpanel.setVisible(true);
        hauptpanel.setLayout(null);

       

        // Hierdrauf wird gezeichnet
        zeichnenPanel = new JLabel();
        zeichnenPanel.setLayout(new BorderLayout());
        zeichnenPanel.setSize(1000, 750);
        zeichnenPanel.setVisible(false);

        // Hier liegen die Buttons
        // Dieses Panel dient den Farbbuttons
        buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(12, 1));
        buttonPanel.setSize(100, 650);

        // Dieses Panel dient dem speichern/laden/zurück buttons
        buttons2Panel = new JPanel();
        buttons2Panel.setLayout(new GridLayout(1, 3));
        buttons2Panel.setSize(900, 30);

        // Die zwei Hauptmenübuttons werden hinzugefügt
        malen = new JButton("Malen");

        // Erstellen der Drawklasse
        final Drawing draw = new Drawing();
        draw.setSize(880, 750);

        // Die Listener werden registriert
        malen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                hauptpanel.setVisible(false);
                zeichnenPanel.setVisible(true);
            }
        });
        // der zurück Button wird eingefügt
        JButton zurueck = new JButton("zurück");
        zurueck.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                hauptpanel.setVisible(true);
                zeichnenPanel.setVisible(false);
            }
        });

        JButton speichern = new JButton("Speichern");
        speichern.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {

                File fileToSave = new File(
                        "C:\\Users\\Alexander Admin\\Desktop\\.jpeg");

                // Variante funktioniert
                String fileName = "C:\\Users\\Alexander Admin\\Desktop\\*.jpeg";

                // Erstelle ein BufferedImage
                int w = draw.getWidth();
                int h = draw.getHeight();
                float quality = 1f;
                BufferedImage bi = new BufferedImage(w, h,
                        BufferedImage.TYPE_INT_RGB);
                Graphics2D big2d = bi.createGraphics();

                // Male das JPanel in das BufferedImage
                draw.paint(big2d);

                Iterator<ImageWriter> iter = ImageIO
                        .getImageWritersByFormatName("jpeg");
                ImageWriter writer = (ImageWriter) iter.next();
                ImageWriteParam iwp = writer.getDefaultWriteParam();
                iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                iwp.setCompressionQuality(quality);

                try {
                    FileImageOutputStream fos = new FileImageOutputStream(
                            fileToSave);

                    if (fileToSave.exists()) {

                    }
                    if (fileName.equals(".jpeg")) {
                        String text = "";
                    }

                    // So wird das Bild gemalt und gespeichert
                    writer.setOutput(fos);
                    IIOImage img = new IIOImage((RenderedImage) bi, null, null);
                    writer.write(null, img, iwp);
                    JOptionPane.showMessageDialog(null, "Bild gespeichert");
                    // Und hiermit kann das BIld noch während das Programm läuft
                    // aufgerufen werden
                    fos.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                draw.clear();
            }
        });

        JButton laden = new JButton("laden");
        laden.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                int ergebnis = chooser.showOpenDialog(MeinPaint.this);
                if (ergebnis == JFileChooser.APPROVE_OPTION) {

                    File file = chooser.getSelectedFile();
                   
                    //Variante 2 //funktioniert nicht
//                    zeichnenPanel.setIcon(new ImageIcon(file.toString()));
                   
                   
                    //Variante 1
                    // aus dem File ein BIld erstellen
                    ImageIcon image = new ImageIcon(file.getAbsolutePath());

                    // Höhe und breite des labels das Panel wurde zum Label umfunktioniert
                    Rectangle rect = /*bildDarstellen*/zeichnenPanel.getBounds();
                    // Ein neues Image wird erstellt und diesem die Höhe und
                    // breite des Labels zugewiesen welches das Label hat
                    Image scaledImage = image.getImage()
                            .getScaledInstance(
                            rect.width, rect.height,
                                    Image.SCALE_DEFAULT);
                    // es wird dem image ein neues bild zugewiesen welches die
                    // höhe und breite des labels hat
                    image = new ImageIcon(scaledImage);
                    // anschließend wird das bild auf das Label gesetzt
                     /*bildDarstellen*/zeichnenPanel.setIcon(image);
                    
                     //der name des files wird angezeigt
//                     String name=file.getName();
//                     bildname.setText(name);
                }else
                    JOptionPane.showMessageDialog(null, "Abgebrochen");
            }
        });

        // Die Farbbuttons werden erstellt
        JButton blau = new JButton("blau");
        blau.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Blau();
            }
        });

        JButton gruen = new JButton("grün");
        gruen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Gruen();
            }
        });

        JButton rot = new JButton("rot");
        rot.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Rot();
            }
        });

        JButton gelb = new JButton("gelb");
        gelb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Gelb();
            }
        });

        JButton schwarz = new JButton("blk");
        schwarz.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Schwarz();
            }
        });

        JButton cyan = new JButton("cyan");
        cyan.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Cyan();
            }
        });

        JButton magenta = new JButton("mg");
        magenta.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Magenta();
            }
        });

        JButton pink = new JButton("pink");
        pink.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Pink();
            }
        });

        JButton grau = new JButton("grau");
        grau.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.Grau();
            }
        });

        // der löschen button wird erstellt
        JButton loeschen = new JButton("C");
        loeschen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                draw.clear();
            }
        });

        // alle Buttons werden der Zeichenfläche hinzugefügt
        buttonPanel.add(blau);
        buttonPanel.add(gruen);
        buttonPanel.add(rot);
        buttonPanel.add(gelb);
        buttonPanel.add(schwarz);
        buttonPanel.add(cyan);
        buttonPanel.add(magenta);
        buttonPanel.add(pink);
        buttonPanel.add(grau);
        buttonPanel.add(loeschen);
        buttonPanel.add(speichern);
        buttonPanel.setBackground(Color.LIGHT_GRAY);

        // Hier werden die buttonpanels auf das zeichnenPanel geaddet
        zeichnenPanel.add(buttonPanel, BorderLayout.WEST);
        zeichnenPanel.add(buttons2Panel, BorderLayout.NORTH);

        // das Bild worauf gemalt wird, wird hinzugefügt ebenso das buttonpanel
        zeichnenPanel.add(draw, BorderLayout.CENTER);
       
        buttons2Panel.add(loeschen);
        buttons2Panel.add(laden);
        buttons2Panel.add(zurueck);

               
        //hier wird das Zeichnenpanel geaddet
        frame.add(zeichnenPanel);
        zeichnenPanel.setVisible(false);
        // das hauptpanel wird auf das Frame geaddet
        frame.add(hauptpanel);
        // hier wird der button dem hauptpanel geaddet
        hauptpanel.add(malen);
        hauptpanel.setVisible(true);
       
        // Die Buttons werden angelegt
        malen.setSize(80, 60);
        // Nur das Hauptpanel ist zuerst sichtbar
        // Das Hauptframe wird angezeigt
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

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

und die Klasse Drawing:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;

/*--------------------------WICHTIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------------------------------*/
public class Drawing extends JComponent
{
        //Auf WAS! möchte ich zeichnen
        Image img;
        BufferedImage icon;
        ImageIcon ii;
        Graphics g;
        //Mit WAS! möchte ich zeichnen
        Graphics2D g2d=(Graphics2D)g;
        //WAS! sind die Werte
        int currentX,currentY,oldX,oldY;
//        MeinPaint mp=null;
//        Zeichen z;
        public Drawing()
        {
            addMouseListener(new MouseAdapter()
            {
                public void mousePressed(MouseEvent e)
                {
                    oldX=e.getX();
                    oldY=e.getY();
                }
                public void mouseClicked(MouseEvent e)
                {
                    currentX=e.getX();
                    currentY=e.getY();
                }
            });
               
            addMouseMotionListener(new MouseMotionAdapter()
            {
                public void mouseDragged(MouseEvent e)
                {
                    currentX=e.getX();
                    currentY=e.getY();
                    g2d.drawLine(oldX,oldY,currentX,currentY);
                    oldX=currentX;
                    oldY=currentY;
                    repaint();
                }
            });
        }

        public void paintComponent(Graphics g)
        {
            try {
                icon=ImageIO.read(new File("C:\\Users\\Alexander Admin\\Desktop\\.jpeg"));
                g.drawImage(icon, 0, 0, null);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if(img==null)
            {
                img=createImage(getSize().width,getSize().height);
                g2d=(Graphics2D) img.getGraphics();
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                clear();
            }
            else if(img!=null)
            {
                g.drawImage(img, 0, 0, this);
            }
        }
       
        //In der clear Methode wir zunächst die Farbe weiß gesetzt. Dann ein weißes Rechteckt gemalt und anschließend die Farbauswahl
        //wieder auf schwarz gesetzt
        public void clear()
        {
            g2d.setPaint(Color.WHITE);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.setPaint(Color.BLACK);
            repaint();
        }
       
        public void Blau()
        {
            g2d.setPaint(Color.BLUE);
            repaint();
        }
       
        public void Gruen()
        {
            g2d.setPaint(Color.GREEN);
            repaint();
        }
       
        public void Rot()
        {
            g2d.setPaint(Color.RED);
            repaint();
        }
       
        public void Gelb()
        {
            g2d.setPaint(Color.YELLOW);
            repaint();
        }
       
        public void Schwarz()
        {
            g2d.setPaint(Color.BLACK);
            repaint();
        }
       
        public void Cyan()
        {
            g2d.setPaint(Color.CYAN);
            repaint();
        }
       
        public void Magenta()
        {
            g2d.setPaint(Color.MAGENTA);
            repaint();
        }
       
        public void Pink()
        {
            g2d.setPaint(Color.PINK);
            repaint();
        }
       
        public void Grau()
        {
            g2d.setPaint(Color.GRAY);
            repaint();
        }
}

Vielen Dank schon mal 🙂
 
public void paintComponent(Graphics g)
{
try {
icon=ImageIO.read(new File("C:\\Users\\Alexander Admin\\Desktop\\.jpeg"));
g.drawImage(icon, 0, 0, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(img==null)
{
img=createImage(getSize().width,getSize().height);
g2d=(Graphics2D) img.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
clear();
}
else if(img!=null)
{
g.drawImage(img, 0, 0, this);
}
}

Du hast momentan 2 Variablen. Einmal icon und einmal img.
du lädst in deiner paintComponent ein Bild und speicherst es in icon ab. icon wiederum wird dann auf das Panel gezeichnet. Dann prüfst du ob img == null ist, was der Fall ist da du img nie setzt. Da er in die if-Verzweigung rein geht (weil img eben null ist) wird dein Panel wieder weiß gemacht (clear() aufgerufen).
Entweder änderst du deine If-Bedingung oder du änderst die Variable in der du das Bild reinlädst 🙂
 
Ich habe die Methode mal etwas abgeändert.

Wenn ich sie wie folgt habe, kann ich noch zeichnen, aber es wird kein bild geladen:
Java:
public void paintComponent(Graphics g)
        {
            try {
                icon=ImageIO.read(new File("C:\\Users\\Alexander Admin\\Desktop\\.jpeg"));
                g.drawImage(icon, 0, 0, null);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if(img==null)
            {
                img=createImage(getSize().width,getSize().height);
                g2d=(Graphics2D) img.getGraphics();
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                clear();
            }
            else if(icon!=null)
            {
                g.drawImage(img, 0, 0, this);
            }
        }
      
        //In der clear Methode wir zunächst die Farbe weiß gesetzt. Dann ein weißes Rechteckt gemalt und anschließend die Farbauswahl
        //wieder auf schwarz gesetzt
        public void clear()
        {
            g2d.setPaint(Color.WHITE);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.setPaint(Color.BLACK);
            repaint();
        }

Wenn ich sie dagegen in irgendeiner anderen Weise abändere, sei es dass ich eine if Abfrage mehr auf icon oder img prüfe oder sonstiges (gerade getestet) werden nur noch Exceptions geworfen. zum einen null pointer exceptions. Diese habe ich testweise korrigiert und andere.
Daher habe ich es wie oben stehend erneut geändert.
Hier muss es doch noch etwas anderes geben woran es liegen könnte... :-/
 
Dein Code ändert noch nichts an dem o.g. Problem. Folgendes geschieht gerade in der Klasse:

Java:
public class Drawing {

   private Image img;  // Imaze zum malen
   private Icon icon;    // Icon für das Bild

   ...
  
   public void paintComponent(Graphics g)
   {
          -neues Bild wird geladen und in icon gespeichernt
          -bild wird gemalt

          -WENN img nicht gesetzt ist
              -erstelle ein neues img zum malen und rufe die Methode clear() auf
          
          -ODER WENN icon gesetzt ist
              -zeichne das img.  [img ist deine Area zum malen]
   }

}

Siehst du den Fehler? Du malst das Bild, erstellst ein neues img zum malen und zeichnest dann über das bild dein img zum malen. (was weiß ist)

Wie dein code ungefähr aussehen sollte (von der Logik her) wäre so:
Java:
public class Drawing {

    private Image img;
    private Icon icon;

   ....

   public void paintComponent(Graphics g)
   {
           -neues Bild laden und in icon speichern.

           -WENN img nicht gesetzt ist
                  - erstelle ein neues img zum malen und rufe die clear() methode auf
                  - WENN icon gesetzt ist (also !=Null)
                       zeichne das icon
        
          - WENN icon gesetzt ist (also !=null)
              zeichne das icon
      }        
}

Warum? Weil folgendes passieren kann:
Er ruft die PaintComponent Methode auf, lädt das Bild.
Dann prüft der ob ein Image zum malen vorhanden ist. Wenn nicht erstellt er ein neues, prüft ob ein Bild zum zeichnen da ist und wenn ja zeichnet er das. Wenn ncicht passiert nichts.
Wenn ein Image zum malen bereits vorhanden ist lässt er den kompletten if Zwei aus und geht zum nächsten. Dort prüft er einfach nur ob ein Icon zum malen vorhanden ist und wenn ja malt er das.
 
Hi Robat, ich habe das gerade noch einmal mit exakt deiner Beschreibung probiert.
Dann klappt es leider nicht. Wenn ich deine Beschreibung vom letzten Post so übernehme und die letzte if Anweisung weglasse (die da drüber ist ja verschachtelt). Dann kann ich zwar nicht mehr malen, aber es wird ein Bild geladen.
 

Neue Themen


Zurück
Oben