Swing Gemaltes Bild über saveDialog speichern unter

Alex2013

Bekanntes Mitglied
Hey Leute,

ich bin meinem Programm soweit fast durch.
Allerdings wollte ich im Programm jetzt noch einen SaveDialog unterbringen über welchen ich die gemalten Bilder lokal abspeichern kann.
Ich habe dazu schon einige Quellen bei google entdeckt. Das Speichern an sich funktioniert aber leider noch nicht so wie gewünscht (also gar nicht).
Hier ein Bild des Programmes:

Hat hier jemand einen Tipp wie ich den JFileChooser richtig einsetzen kann bzw. das gemalte Bild des Frames gespeichert werden kann?
 

Anhänge

  • Ergebnis.jpg
    Ergebnis.jpg
    90 KB · Aufrufe: 39
Bisher habe ich es über die folgenden Varianten versucht:
Java:
JButton speichern=new JButton("Speichern");
        speichern.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
               
           
                String pfad="";
                JFileChooser chooser;
                if (pfad == null)
                    pfad = System.getProperty("C:\\Users\\Alexander Admin\\Desktop");
                File file = new File(pfad.trim());
//
//                chooser = new JFileChooser(pfad);
//                chooser.setDialogType(JFileChooser.SAVE_DIALOG);
//                FileNameExtensionFilter plainFilter = new FileNameExtensionFilter(
//                        "Markup: png, bmp, tif, jpeg", "png", "bmp", "tif","jpeg");
//                FileNameExtensionFilter dateiTyp=new FileNameExtensionFilter("", "png", "bmp", "tif","jpeg");
//                FileNameExtensionFilter markUpFilter = new FileNameExtensionFilter(
//                        "Markup: png, bmp, tif, jpeg", "png", "bmp", "tif","jpeg");
//                chooser.removeChoosableFileFilter(chooser.getAcceptAllFileFilter());
//                chooser.setFileFilter(plainFilter);
//                chooser.setFileFilter(markUpFilter);
//                chooser.setDialogTitle("Speichern unter...");
//                chooser.setVisible(true);
//
//                int result = chooser.showSaveDialog(null);
//
//                if (result == JFileChooser.APPROVE_OPTION) {
//
//                    pfad = chooser.getSelectedFile().toString();
//                    file = new File(pfad);
//                    if (plainFilter.accept(file))// || markUpFilter.accept(file))
//                        System.out.println(pfad + " kann gespeichert werden.");
//                    else
//                        System.out.println(pfad + " ist der falsche Dateityp.");
//
//                    chooser.setVisible(false);
//                }
//                chooser.setVisible(false);
                
           
               
       
                JFileChooser chooser2= new JFileChooser();
                Dimension d=Toolkit.getDefaultToolkit().getScreenSize().getSize();
               
                int wert=chooser2.showSaveDialog(null);
                if(wert==JFileChooser.APPROVE_OPTION)
                {
                    chooser2.setSelectedFiles(null);
                    chooser2.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                    chooser2.setDialogType(JFileChooser.SAVE_DIALOG);
                }
               
               
//                Integer vielSpeichern[][]=new Integer[][]{(Integer[])d.getSize().width,(Integer[])d.getSize().height};
//                int vielSpeichern2[][]=new int[][]{d.getSize().width[],d.getSize().height[]};
                try {
//                    File file2=chooser.getSelectedFile();
                    FileWriter fw=new FileWriter(file);
//                    fw.write(file);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                e.printStackTrace();
                }
            }
            });
 
So, ich habe jetzt schon mal erreicht, dass das Bild manuell gespeichert werden kann.
Allerdings muss hierfür vorher bei jedem Bild der Pfad angepasst werden. Das soll natürlich nicht sein.
Kann mir jemand sagen, wie ich in den Code einen Speichern unter Dialog einbauen kann ohne dass ich den Speicherort im Programm selbst ändern muss bzw. dass dieser jedes Mal vorher im Programm selbst wieder angepasst werden muss?

@Robat : hast du hier eine Idee oder @Meniskusschaden : hast du eine Idee?

Die aktuelle speichern Methode:
Java:
String fileName = "C:\\Users\\Alexander Admin\\Desktop\\Bild_3.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(new File(
                            fileName));
                    writer.setOutput(fos);
                    IIOImage img = new IIOImage((RenderedImage) bi, null, null);
                    writer.write(null, img, iwp);

                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
 
Mit angepasst meine ich, dass ich die folgende Zeile im Eclipse Programm selbst manuell ändern/anpassen muss, damit das bereits existierende Bild nicht überschrieben wird:
Java:
speichern.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                File file = null;
                String fileName = "C:\\Users\\Alexander Admin\\Desktop\\Bild_5.jpeg";
Daher wollte ich hier einen JFileChooser einsetzen damit ich bei jedem speichern einen neuen Dateinamen verwenden kann. Der Einsatz des FileChoosers will mir in diesem Bsp. aber nicht gelingen.
Oder hast du da eine Idee?
Aktuell habe ich es aber immerhin schon so, dass die Bilder wie folgt gespeichert werden:
Bild_1.jpeg
Das heißt, es wird nur das wesentliche gespeichert.
 
Irgendwie versteh ich dein Problem nicht so richtig. Wenn du den Btn speichern drückst, dann kannst du ja einen neuen JFileChooserDialog aufmachen, den user den Pfad aussuchen lassen, Namen eingeben - mit File f = fileCHooser.getSelectedFile() holst du dir das File und speicherst dann.
Quick und dirty könnte das so aussehen:

Java:
JFrame frame= new JFrame();

JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Speichern.."); 

int userSelection = fileChooser.showSaveDialog(frame);

if (userSelection == JFileChooser.APPROVE_OPTION) {
 File fileToSave = fileChooser.getSelectedFile();
 System.out.println("Save as file: " + fileToSave.getAbsolutePath());
}
 
Ich versuchs noch mal zu erklären.
Mein insgesamt dritter Post von oben arbeitet an sich schon richtig. das heißt, über den dortigen Code wird das Bild gespeichert. Allerdings muss ich, wenn ich bereits ein Bild erstellt habe, den Pfad wieder manuell ändern um das bereits existierende Bild nicht zu überschreiben. Dann wäre es quasi gelöscht.

Mit der anderen Variante die ich gepostet habe, wurde zwar der Speichern Dialog aufgerufen. Das Bild ließ sich aber nicht wie gewünscht speichern. Es war in einem anderen Format hinterlegt, so dass ich es nur löschen konnte.
Daher wollte ich den bereits bestehenden Code, mit welchem das Speichern an sich funktioniert, soweit umstellen, dass während des Vorgangs aber auch der Speicherndialog aufgerufen wird.
Das ist mir leider noch nicht gelungen...


Ich habe deinen Code gerade mal ausprobiert, so wie er da steht. Hier wird zwar auch der Dialog aufgerufen, aber das gemalte Bild nicht abgespeichert.
Oder fehlte in dem Code noch etwas? :-O
 
String fileName = "C:\\Users\\Alexander Admin\\Desktop\\Bild_3.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(new File(
fileName));
writer.setOutput(fos);
IIOImage img = new IIOImage((RenderedImage) bi, null, null);
writer.write(null, img, iwp);

} catch (Exception ex) {
ex.printStackTrace();
}
}

Also der Code funktioniert, wenn ich das richtig verstanden habe? Dann sollte es doch eig. nicht so schwer sein.
Über den Code aus meinem letzten Post holst du dir den Pfad / die Datei in der gespeichert werden soll.

Java:
JFileChooser f = new JFileChooser();
userSelection = f.showSaveDialog();

if(userSelection ==JFileChooser.APPROVE_OPTION){
File fileToSave = fileChooser.getSelectedFile();

}

Das fileToSave müsstest du ja dann eig. hier einsetzten können:
Java:
FileImageOutputStream fos =new FileImageOutputStream(fileToSave));
 
Ich verstehe eigentlich nicht, was dir noch fehlt. In deinem eigenen Code erzeugst du doch aus dem Dateipfad ein File-Objekt. Da kannst du doch ebenso gut das File-Objekt nutzen, dass du aus dem Vorschlag von @Robat bekommst.
 
@Robat: Nein, das funktioniert aktuell noch nicht. Das file wird als ein String initialisiert.
Ich poste einfach noch einmal den ganzen Code der Methode. Vlt. wird es dann klarer.

Ich habe den Code aktuell noch mit den Bordmitteln von Eclipse angepasst, damit der Compiler nicht mekkert. Dies behebt das Problem aber nicht. Mit dem folgenden Code wird noch nichts gespeichert. Er zeigt es zwar an, es ist lokal aber nichts vorhanden.
Code:
Java:
JButton speichern=new JButton("Speichern");
        speichern.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
              
                //Variante Robat //funktioniert nicht
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setDialogTitle("Speichern..");
                File fileToSave;
                int userSelection = fileChooser.showSaveDialog(frame);

                if (userSelection == JFileChooser.APPROVE_OPTION) {
                 fileToSave = fileChooser.getSelectedFile();
                 JOptionPane.showMessageDialog(null, "gespeichert"+
                fileToSave.getAbsolutePath());
                }
              
              
                //Variante funktioniert
                File file = null;
                String fileName = "C:\\Users\\Alexander Admin\\Desktop\\Bild_9.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(new File(getName()));
                    writer.setOutput(fos);
//                    writer.setOutput(getName());
                    IIOImage img = new IIOImage((RenderedImage) bi, null, null);
                    writer.write(null, img, iwp);

                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                JOptionPane.showMessageDialog(null, "Bild gespeichert");
              
            }
        });


Vlt. sehe ich aber auch gerade einfach den Wald vor lauter Bäumen nicht... :-(
 
Hast du dir meinen Post überhaupt angeguckt? 😕

Das saveToFile Object, was du aus dem JFileChooser bekommst, kannst du einfach deinem FileImageOutputStream übergeben.
Du kannst dir von dem File auch den AbsolutPath holen und den deinem new File() Konstruktor übergeben.

Oder sehe ich das falsch @Meniskusschaden ?

Java:
// Aus:
FileImageOutputStream fos =new FileImageOutputStream(new File(getName()));

// Soll:
FileImageOutputStream fos =new FileImageOutputStream(fileToSave));

// oder
FileImageOutputStream fos =new FileImageOutputStream(new File(fileToSave.getAbsolutPath()));

// werden
 
@Robat : doch deinen Post habe ich mir durchgelesen. Wenn es um das Speichern von Dateien oder um den FileChooser geht, bin ich aber anscheinend noch nicht so bewandert wie ihr.
Ich werds gleich noch mal ausprobieren und schauen ob es funktioniert.
So schwer kann es ja eigtl. nicht sein... :-S
 
bin ich aber anscheinend noch nicht so bewandert wie ihr.
Ich würde nicht von mir sagen, dass ich bewandert bin 😛 .. Es gibt viele Dinge die ich auch nicht weiß ( Ein weiser Mann sagte mal: Umso mehr man weiß, umso weniger weiß man. )

Schau dir einfach noch mal in Ruhe an, was bei dem JFileChooser passiert und was wann und wie zurück geben wird. Dann wird das schon 🙂
 
Ok, ich habs mir jetzt noch mal angesehen. Das Speichern funktioniert jetzt doch endlich 🙂
Jetzt muss ich nur noch einen Weg finden, wie ich die gespeicherten Dateien als png, jpeg oder Sonstiges speichern kann und es anschließend auch anzeigen lassen kann.

gespeicherte Datei.jpg

Das versuche ich aber später... ;-)
 

Neue Themen


Zurück
Oben