JPanel-Oberfläche speichern

beastofchaos

Bekanntes Mitglied
Hallo Leute,
ich bin seit 3-4 Wochen fleißig mit Java beschäftigt und arbeite mich lagnsam voran vom Wissen her. Ich arbeite seit gestern an einem Zeichenprogramm und da ich schon einiges eingebaut habe, frag ich mich nun, wie lässt sich das optimal speichern?

Habe natürlich viel gegooglet und z.B. sowas gefunden:
kleines "Tutorial"
Forumthema

Wobei ich daraus noch nicht 100%ig schlau geworden bin 🙁

Hier mal meine Methode "save()":

Java:
public void save(){    	
	  	FileDialog d = new FileDialog(this,"Bild speichern...",FileDialog.SAVE);
	    d.setLocale(Locale.getDefault());
	    d.setVisible(true);
	  	
	    String name = d.getDirectory();
	    name += d.getFile();
	  	
	  	
	  	BufferedImage img = new BufferedImage(935,680, BufferedImage.TYPE_INT_RGB);
	  	tempPanel.paint(img.createGraphics());                       // tempPanel ist das JPanel
	 
	  	try{
	  		ImageIO.write(img, "jpeg", new File(name));    
	  	} 
	  	catch (IOException e) {
			e.printStackTrace();
	  	}

    }

Wenn ich das bisher richtig verstanden habe, muss ich das in ein BufferedImage umwandeln, wobei es schon da bei mir hackt - wie ihr seht benutzt ich
Code:
tempPanel.paint(img.createGraphics());
. Wenn ich das Bild dadurch nun speichern und ausgeben(durch Paint) lass. Wird der "Hintergrund" schwarz und nur andere Farben als schwarz kommen noch hervor. In der paint()-Methode von tempPanel benutzt ich "clearRect", weshalb ich dachte, das schwarz stellt das "nichts" da, wie man das von Paint halt kennt. Also hab ich nochmal ein weißes Rechteck auf dem TempPanel gemalt und alle Objekte(sprich Kreise etc.) neu gezeichnet - kein Erfolg :/ Das selbe hab ich auch vor dem "Überspielen" bei dem BufferedImage versucht... ebenfalls gescheitert.

Wisst ihr eine Lösung für mein Problem oder vll. eine andere Möglichkeit, um mein JPanel als Bild zu speichern?

Gruß, der neue User Thomas 😉
 
Also ich denke, die paint()-Methode muss ich nicht zeigen - ihr solltet nur wissen, dass ich darin "clearRect()" benutzt habe, was dazu führt, dass er den Hintergrund "löscht" und das wird standardmäßig schwarz gespeichert in den Bildern :/
Ich hab jetzt "clear" nicht entfernt, sondern die paint()-Methode ausgelassen - ich benutzte nämlich eine zweite Methode in dem Panel namens "DrawElements()", die dafür gedacht ist, nach dem "clearRect()" alle Kreise/ Rechtecke/ etc. neu zu zeichen(wurden alle in einem dyn. Array gespeichert). Funktioniert jetzt, bloß habe ich jetzt noch das Problem, dass die Qualität der Bilder schwach ist. Gibt es noch eine andere besser Möglichkeit, Bilder zu speichern?

Gruß, Thomas

PS: Und danke für den Link, werde ich sofort anschaun und lernen 😀
 
Nun ich habe wieder einiges im Programm geändert, hier mal die neue save()-Version:

Java:
private boolean save(){ 
	  	saveDia = new JFileChooser();
	  	saveDia.setDialogTitle("Bild speichern...");
	  	if (saveDia.showSaveDialog(this) == JFileChooser.CANCEL_OPTION) {
	  		return false;
	  	}
	  	
	    File file;
	    file = saveDia.getSelectedFile();
	  	
	  	Dimension tempDim = tempPanel.getSize(); 
	  	BufferedImage img = new BufferedImage(tempDim.width,tempDim.height, BufferedImage.TYPE_INT_RGB);
	  	Graphics  tempGC = img.getGraphics();
	  	try {
	  		tempGC.setColor(Color.white);
	  		tempGC.fillRect(0, 0, tempDim.width, tempDim.height);
	  		tempPanel.drawElements(tempGC);
	  	} finally {
	  		tempGC.dispose();
	  	}
	 
	  	try{
	  		ImageIO.write(img, "jpeg", file); 
	  		saved = true;
	  	} 
	  	catch (IOException e) {
			e.printStackTrace();
			saved = false;
	  	}
	    
	    return saved;
    }

Also nun kann man auch zwischen jpg/png/gif/etc. entscheiden 😛
Und das "clearRect" wird nun auch nicht mehr aufgerufen.

Außerdem ist bei den Ergebnissen zwischen der Qualität von jpg und png kein Unterschied zu machen :/

Kann doch nicht sein, dass man keine gute Qualität hinbekmmt *genervt* 🙂
 
Die Qualität bei PNG ist... eigentlich "100%", also es wird 1:1 gespeichert, was auch angezeigt wird. ???:L (Guckst du dir die Bilder vielleicht mit dieser "Windows Fax-Anzeige" an? 😉 )

EDIT: BTW, der Code mit dispose im finally und so: Viiieeel besser 🙂 Auch wenn immernoch einige Sachen in der Methode vermischt sind...
 
Jep, ich muss natürlich den Quelltext iwann noch strukturieren, bevor ich da weiter arbeite 😛

Und ich schau mir die Bilder per Windows-Vorschau, Paint.Net und diesem Programm selbst an. Das Programm kann super Bilder laden - mit guter Qualität. Hab ich schon an einigen meiner Bilder getestet 🙂
 

Zurück
Oben