JPanel zu Image

hansmueller

Mitglied
Hallo,
ich bin neu hier im Forum und habe folgendes Problem:
Ich habe eine Klasse um ein JPanel erweitert. Dieses JPanel enthält diverse JPanels und JLabels, welche mit verschiedenen LayoutManagern angeordnet werden.
Dieses JPanel möchte ich gerne ausdrucken, OHNE das es vorher auf dem Bildschirm ausgegeben wird. Dazu muß ich es in ein Image umwandeln. Und das will bei mir nicht richtig funktionieren.
Ich habe ein kleines Programm zum Ausprobieren geschrieben.
Die Klasse "Bildaufbau" stellt das JPanel dar, welches in ein Image umgewandelt werden soll. Die Klasse "Arbeit" enthält eine Methode, welche die Umwandlung bewerkstelligen soll. Darüberhinaus wird dieses erzeugte Image als ImageIcon in einem JLabel auf dem Bildschirm ausgegeben, um zu kontrollieren, ob die Umwandlung richtig funktioniert hat.

Ich habe es bisher nur geschafft, daß die Elemente links oben in die Ecke geknallt werden. Die Layoutmanager werden gar nicht berücksichtigt.
Ich habe schon vieles Ausprobiert und im Netz gesucht, aber nichts gefunden, das funktioniert.
Vielleicht weiß einer von euch, was ich Falsch mache.

Hier das Versuchsprogramm (Es besteht aus drei Klassen):

1. Klasse:
Java:
public class Bildchen
{
	public static void main(String[] args)
	{
		Arbeit arb = new Arbeit();
	}
}

2. Klasse:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Bildaufbau extends JPanel
{
	public Bildaufbau()
	{
				
		this.setBounds(0, 0, 200, 300);
		this.setLayout(new BorderLayout());
		this.setBackground(Color.CYAN);
		
		JPanel yx = new JPanel();
		yx.setLayout(new FlowLayout());
		yx.setBounds(new Rectangle(50,50));
		yx.setBackground(Color.BLUE);
		
		JPanel we = new JPanel();
		we.setLayout(new FlowLayout());
		we.setBounds(new Rectangle(150,70));
		we.setBackground(Color.GREEN);
		
		JLabel as = new JLabel("TestTestTest");
		as.setBounds(new Rectangle(100, 50));
		
		we.add(as);
		
		this.add(yx, BorderLayout.NORTH);
		this.add(we, BorderLayout.SOUTH);		
	}
}

3. Klasse:
Java:
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;


public class Arbeit
{
	public Arbeit()
	{
		Fenstermachen();
	}
	
	public void Fenstermachen()
	{
		JFrame Versuch = new JFrame();
		Versuch.setBounds(0, 0, 700, 800);
		Versuch.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Versuch.setLayout(new BorderLayout());
		JLabel x = new JLabel();
		ImageIcon ic = new ImageIcon();
				
		Image i = getSnapShot(new Bildaufbau());
		
		ic.setImage(i);
		x.setIcon(ic);
		
		JScrollPane sp = new JScrollPane(x);
		sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
		Versuch.add(sp, BorderLayout.CENTER);
		Versuch.setVisible(true);
	}
	
	public BufferedImage getSnapShot(JPanel view)
	{
		 int w=view.getWidth();
		 int h=view.getHeight();
		 
		 BufferedImage image = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
		 
		 synchronized(view.getTreeLock())
		 {
			 //view.setVisible(true);
			 //view.repaint();
			 view.paint(image.createGraphics());
			 //view.paintAll(image.createGraphics());
			 //view.paintComponents(image.createGraphics());
			 
		 }
		 
		 return image;
	}
}
 
Zuletzt bearbeitet:
Moin,

nutze bitte mal die Java-Code-Tags.
Dann ist es für alle ansehnlicher und kann einfacher bearbeitet werden.

So benutzt Du die Code-Tags:
[ java ] Hier Dein Code [ /code ]

Gruß,
Xan

PS: Einfach den Beitrag editieren ;)
 
Zuletzt bearbeitet:
Hi Xandro,

Codetags schön und gut, aber immer wenn ich den Code copy/paste habe ich entweder Hashes (#) oder Zeilennummern vor dem Code. Konnte noch nicht nachvollziehen, wann Hashes und wann Zeilennummern kopiert werden.
Das ist recht nervig :confused:

Wie kann ich denn den reinen Code kopieren?

Gruß
joschi
 
Moin,
Wie kann ich denn den reinen Code kopieren?
Mit diesem Problem stehst Du sicher nicht alleine da.
Ich glaube, der Unterschied zwischen den Rauten und Zeilennummern sind die Code-Tags.
Wenn jemand die PHP-Tags verwendet sind es Rauten, bei den Java-Tags sind es Zeilennummern.
Habe bis jetzt noch nicht herausfinden können, wie genau man das ganze während des Kopierens filtern kann.
Ich muss es ebenso im Nachhinein immer rauspicken.

Gruß,
Xan
 
Hi,

@Xandro: Danke für die Antwort :)

@hansmueller:
Nun zur eigentlichen Frage.
Ich hab das mal probiert und aus meiner Sicht sieht das ganz gut aus.
Aber vielleicht hab ich was übersehen.

Hier mein Test-Code:

Java:
    public static void main(String[] args) throws Exception {
    	JFrame frame = new JFrame("Test Frame");
    	Bildaufbau aufbau = new Bildaufbau();

       // Panel etwas grösser darstellen
    	aufbau.setPreferredSize(new Dimension(640, 480));
    	frame.getContentPane().add(aufbau);
    	frame.pack();
    	
    	// Zu druckende Komponente
    	Component componentToPrint = frame.getContentPane();
    	
    	// Buffered Image erzeugen
    	BufferedImage image = new BufferedImage(componentToPrint.getWidth(), componentToPrint.getHeight(), BufferedImage.TYPE_INT_RGB);
    	
    	// Double Buffering ausschalten
    	RepaintManager repaintManager = RepaintManager.currentManager(componentToPrint);
    	repaintManager.setDoubleBufferingEnabled(false);
    	
    	// Bild erzeugen
    	componentToPrint.paint(image.createGraphics());
    	
    	// Bild in neuem Frame darstellen
    	JFrame frame2 = new JFrame("Out");
    	frame2.getContentPane().add(new JLabel(new ImageIcon(image)));
    	frame2.pack();
    	frame2.setVisible(true);
    	frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}


Gruß
joschi
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück