Unsichtbare Komponente in ein Bild rendern?

Status
Nicht offen für weitere Antworten.

patb

Mitglied
Hallo,

ich würde gerne den Inhalt einer Komponente (z.B. ein JPanel mit mehreren components als Inhalt des Containers) in ein Bild rendern und dieses Abspeichern.

Das ist ja nicht so schwer - ich erstelle ein Image Objekt, hole mit davon das Graphics Objekt und zeichne die Komponente dann per paintComponents( graphics) in das Image Objekt.

Nun das Problem: ich würde das auch gerne tun können, ohne dass die Komponente angezeigt wird, ja vielleicht sogar ohne, dass sie Teil eines anderen Containers, z.B. eines Fensters ist. Natürlich ist es so, dass nichts gezeichnet wird, wenn die Komponente unsichtbar ist. Kann man das vielleicht irgendwie übergehen?

Ich hätte auch die Möglichkeit, die zu zeichnende Komponente doch in mein Fenster zu legen und anzuzeigen, dann aber nicht in voller Größe, sondern kleiner, sodass nur ein Teil davon sichtbar ist. Hier ist aber wieder das Problem: nur der sichtbare Bereich wird dann in das Bild gerendert, auch das ist natürlich verständlich, es sollen ja Zeichenoperationen gespart werden. Aber wie könnte man es forcieren, dass alles von der Komponente gezeichnet wird?


Ich würde mich über ein paar Tipps und Gedanken von Euch zu dem Thema sehr freuen


Vielen Dank für Eure Hilfe!
 

patb

Mitglied
Hobbit_Im_Blutrausch hat gesagt.:
Mit den SwingUtilities geht das.

Danke für Deine Antwort. Gibt es auch eine Möglichkeit, ohne dass die zu zeichnende Komponente Teil der Containment Hierarchy ist? Sprich, die Komponente wurde keinem Container hinzugefügt?

Denn SwingUtilitys.paintComponent benutzt intern nen CellRendererPane, welcher auf jeden Fall Teil eines anderen Containers sein muss.
 

kleiner_held

Top Contributor
was spricht gegen ein einfaches paint(Graphics)?
Code:
public class RenderSample
{
	public static void main(String[] args) throws Exception
	{
		JTable table = new JTable(new String[][] {{"A1", "A2" , "A3"}, {"B1", "B2" , "B3"}} , new String[] {"Header 1", "Header 2", "Header 3"});
		JPanel panel = new JPanel(new BorderLayout());
		panel.add(table.getTableHeader(), BorderLayout.NORTH);
		panel.add(table, BorderLayout.CENTER);
		panel.setSize(panel.getPreferredSize());
		panel.doLayout();
		BufferedImage bi = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_RGB);
		Graphics graphics = bi.createGraphics();
		panel.paint(graphics);
		graphics.dispose();
		ImageIO.write(bi, "png", new File("./test.png"));
	}
}
 

patb

Mitglied
kleiner_held hat gesagt.:
was spricht gegen ein einfaches paint(Graphics)?

Genau der Text, den ich Eingangs nach "Nun das Problem:" geschrieben habe spricht dagegen :)

Nochmal: eine Komponente zu zeichnen, die angezeigt wird/sichtbar ist, ist kein Problem (wie in Deinem Beispiel-Code). Aber eine Komponente zeichnen, die unsichtbar ist, nicht in der Containment Hierarchiy ist oder nur teilweise sichtbar ist, ist ein Problem.
 

kleiner_held

Top Contributor
Die Komponente (das JPanel) in dem Beispiel wird aber nirgendwo angezeigt (sprich panel.getParent() ist null) oder was meinst du mit unsichbar?
 

patb

Mitglied
Hm, ich glaube ich habe bei mir einen Spezialfall, den ich zuvor nicht bedacht habe. Die zu zeichnende Komponente ist bei mit Teil eines JDialogs, der gerade nicht angezeigt wird.

Könnte das der Grund sein, warum nicht gezeichnet wird? Also wenn die Komponente doch Teil der Containment Hierarchie ist, aber der Parent ist unsichtbar, oder gar das JDialog, in der das ganze liegt? Ich frage mich, warum er bei mir sonst nicht zeichnet...
 

kleiner_held

Top Contributor
Das die Komponente Teil eines JDialogs ist sollte fuers Zeichnen erst mal kein Problem sein.
Natuerlich muss die Komponente wie schon angesprochen eine sinvolle Groesse haben.

Eine Komponente im JDialog bekommt ihre Groesse vom JDialog und wenn der Dialog nicht sichtbar ist, wird das Layout teilweise weggelassen.

Im unten angepassten Beispiel sieht man, das die Komponente erst nach einem pack() eine Groesse zugewiesen bekam,
selbst ein validate hat nichts bewirkt:

Code:
public class RenderSample
{
	public static void main(String[] args) throws Exception
	{
		JDialog dialog = new JDialog();
		JTable table = new JTable(new String[][] {{"A1", "A2" , "A3"}, {"B1", "B2" , "B3"}} , new String[] {"Header 1", "Header 2", "Header 3"});
		JPanel panel = new JPanel(new BorderLayout());
		panel.add(table.getTableHeader(), BorderLayout.NORTH);
		panel.add(table, BorderLayout.CENTER);
		dialog.add(panel);
		System.out.println(panel.getSize()); // width=0,height=0
		dialog.setSize(200, 100);
		System.out.println(panel.getSize()); // width=0,height=0
		dialog.validate();
		System.out.println(panel.getSize()); // width=0,height=0
		dialog.pack();
		System.out.println(panel.getSize()); // width=225,height=48
	}
}
 

patb

Mitglied
Vielen Dank für Eure Antworten. Also dann bin ich davon überzeugt, dass es so funktionieren muss - und dass ich anscheinend einen anderen Fehler habe. Ich werde das schrittweise runterbrechen, und hoffe es hinzubekommen.

Was jedoch noch offen ist - glaube ich - ist der Fall, wenn eine Komponente schon in einem Container ist, aber der Container zu klein ist, um die gesamte Komponente anzuzeigen. Es ist in dem Fall also nur ein Teil der zu zeichnenden Komponente sichtbar. In dem Fall zeichnet er auch nur den sichtbaren Teil in das Bild - wie kann man dieses Clipping umgehen? Oder reicht hier das SwingUtilities.paintComponent?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Unsichtbare Komponenten zeichnen AWT, Swing, JavaFX & SWT 4
S Scrollbares Bild und Unsichtbare TextFields AWT, Swing, JavaFX & SWT 7
H Unsichtbare JButtons? AWT, Swing, JavaFX & SWT 5
S Unsichtbare farbe AWT, Swing, JavaFX & SWT 2
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
Q-bert Dynamische Komponente erzeugen AWT, Swing, JavaFX & SWT 6
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
T Komponente wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
S Swing Komponente wird überblendet AWT, Swing, JavaFX & SWT 27
A Swing Komponente mehrseitig ausdrucken AWT, Swing, JavaFX & SWT 2
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
R Swing Komponente austauschen AWT, Swing, JavaFX & SWT 2
M JApplet mit Java 3D Komponente AWT, Swing, JavaFX & SWT 6
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
S Spezielle komponente aktualisieren AWT, Swing, JavaFX & SWT 9
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
B Komponente "sauber" entfernen(JToolBar) AWT, Swing, JavaFX & SWT 4
xehpuk Swing Komponente in Graustufen zeichnen AWT, Swing, JavaFX & SWT 2
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
darekkay Swing Komponente zur Laufzeit neuinitialisieren AWT, Swing, JavaFX & SWT 6
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
F visuelle Komponente AWT, Swing, JavaFX & SWT 3
padde479 Komponente gesucht AWT, Swing, JavaFX & SWT 2
A Swing Komponente für Swing und JSF durch MVC AWT, Swing, JavaFX & SWT 5
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
A Swing suche OpenSource Date(Time)Picker Komponente AWT, Swing, JavaFX & SWT 9
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
B Erfragen der Komponente AWT, Swing, JavaFX & SWT 4
M Mausklick an darunterliegende Komponente weiterleiten AWT, Swing, JavaFX & SWT 9
B (Swing) Welche Komponente für unterteilten Text? AWT, Swing, JavaFX & SWT 4
D Wie nennt sich beschriebene Komponente? (-> Autocomplete) AWT, Swing, JavaFX & SWT 5
D Komponente im FlowLayout nicht mittig sondern rechts. Wie? AWT, Swing, JavaFX & SWT 4
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
padde479 Suche eine Komponente (->ToolBar) AWT, Swing, JavaFX & SWT 7
algorismi Browser Komponente AWT, Swing, JavaFX & SWT 3
G Swing Auswahlrechteck über Komponente zeichnen AWT, Swing, JavaFX & SWT 3
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Swing Komponente mit setLocation auf JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 3
G Gibt es diese Komponente? AWT, Swing, JavaFX & SWT 11
slawaweis Suche TagCloud Komponente für Swing AWT, Swing, JavaFX & SWT 10
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
D swt komponente in swing-frame AWT, Swing, JavaFX & SWT 4
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
N Suche nach Komponente / LaF AWT, Swing, JavaFX & SWT 21
A Komponente zur Laufzeit hinzufügen und RICHTIG anzeigen AWT, Swing, JavaFX & SWT 3
T Swing Gibt es eine Komponente für eine farbliche Editorbox? AWT, Swing, JavaFX & SWT 6
S Swing Komponente mit jogl AWT, Swing, JavaFX & SWT 18
Airwolf89 Swing Von anderer Klasse auf Eigenschaften einer Komponente zugreifen AWT, Swing, JavaFX & SWT 5
SuperSeppel13 Komponente transparent übermalen AWT, Swing, JavaFX & SWT 2
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
R Lineal an einer Komponente AWT, Swing, JavaFX & SWT 10
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Ham Swing PropertyChangeListener aufrufende Komponente AWT, Swing, JavaFX & SWT 5
hdi LayoutManager GridBagLayout : Komponente hat falsche Größe? AWT, Swing, JavaFX & SWT 2
hdi Swing Suche passende API Klasse(n) für meine Komponente AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
H Name einer Komponente ermitteln AWT, Swing, JavaFX & SWT 5
Developer_X Swing Problem beim "rezeichnen" -> Überzeichnen der Komponente AWT, Swing, JavaFX & SWT 8
M Suche Java Komponente AWT, Swing, JavaFX & SWT 2
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
A Suche TreeTable-Komponente AWT, Swing, JavaFX & SWT 12
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
C Spaltenorientierte Komponente, ähnlich JTabbed gesucht AWT, Swing, JavaFX & SWT 4
V Suche Komponente AWT, Swing, JavaFX & SWT 2
G Komponente zur Laufzeit tauschen. AWT, Swing, JavaFX & SWT 5
G Coverflow -artige Komponente für Swing? AWT, Swing, JavaFX & SWT 2
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
Landei Welche Kalender-Komponente? AWT, Swing, JavaFX & SWT 3
G Komponente in der der Cursor steht zurückgeben? AWT, Swing, JavaFX & SWT 2
G Komponente die im Center und North Bereich liegt zurückgebe? AWT, Swing, JavaFX & SWT 6
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
G Kennt jemand diese Komponente? AWT, Swing, JavaFX & SWT 2
G Palette Komponente für Swing? AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben