Aus Swing Oberfläche Bild erzeugen

Status
Nicht offen für weitere Antworten.

mephi

Bekanntes Mitglied
Ist es möglich zB aus einem JFrame direkt ein Bild zu generieren?

Meine Idee bisher war es, die Position und größe des Fensters auszulesen und davon dann ein Screenshot zu machen, aber vielleicht geht dies ja einfacher?
 

mephi

Bekanntes Mitglied
hier mal ein ganz einfacher versuch:

Code:
public MyFrame() {
		this.setSize(400, 300);
		this.setVisible(true);
		BufferedImage i = new BufferedImage(this.getWidth(), this.getHeight(), 1);
		Graphics g = i.getGraphics();
		this.paintComponents(g);
	}

ist das so richtig? und wie gehts dann weiter?

edit:
irgendwie komm ich da nie ganz klar. ich komm durch rumprobieren und api studieren irgendwie auf keinen vernünftigen nenner..
 

thE_29

Top Contributor
Naja und das schreibst via ImageIO.write(i, "png", new File("C:\\output.png")); raus!

Oder nimm jpg (obwohl das net so super ist).


Achja, für deinen obigen Befehl da: So würde ich das nur machen, wenn dein JFrame "nicht am Bildschirm ist"

Ich habe mir manchmal geholfen, wenn ich was ausdrucken wollte indem ich nen JDialog gemacht habe und den auf -1000,-1000 positioniert habe :) Ist zwar net gerade die feine Methode aber es klappt!

Jedenfalls bei Screnncapturen, könntest du auch einfach Robot.createScreenCapture(Rectangle screenRect) nehmen!

Wobei das rect halt von deinem Frame, etc ist...
 

mephi

Bekanntes Mitglied
ok so klappts nun fast
Code:
public MyFrame() {
		this.setSize(400, 300);
		this.setVisible(true);
		BufferedImage i = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
		Graphics g = i.getGraphics();
		this.paintComponents(g);
		try {
			ImageIO.write(i, "png", new File("C:\\output.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

nur ist die farbe etwas komisch d.h. was eigentlich so typisch java blau(unter win) sein sollte ist dann schwarz so wie ich es momentan mache. welches imageType brauch ich denn?
 

thE_29

Top Contributor
BufferedImage.TYPE_INT_ARGB

Oder probier das Robot.createScreenn... (ist aber keine statische Methode, dh du musst Robot zuerst instanzieren)
 

mephi

Bekanntes Mitglied
ok. mit dem imageType geht es zwar nun doch gibt andere fehler wenn ich zB ein JTextPane zum test hinzufüge.

warum ist die erste variante denn nur zu empfehlen wenn das fenster "nicht am bildschirm" ist

ich brauch das ganze für ein jspwiki plugin um aus zB soetwas : http://www.freshcookies.org/jtreemap/iso-example.png einfach ein bild zu machen

so ein plugin läuft natürlich im hintergrund ab. also es wird nie wirklich etwas angezeigt. denke da fällt die createScreenCapture variante weg
 

thE_29

Top Contributor
Naja, createScreenCapture macht dir halt vom derzeit angezeigten ein Bild!

Und das halt so groß wie du es angibst! Probier das mal!
 

mephi

Bekanntes Mitglied
kann ich heute als plugin selbst leider nicht mehr testen.
aber man kann sich dass so vorstellen dass ein user verschiedene daten auf einer HP eingibt, dann wird serverseitig etwas erzeugt. dachte bisher an ein jframe(vielleicht gehts aber auch anders) und daraus wird ein bild erstellt. also es wird nie wirklich etwas angezeigt
 

The_S

Top Contributor
mephi hat gesagt.:
ok so klappts nun fast
Code:
public MyFrame() {
		this.setSize(400, 300);
		this.setVisible(true);
		BufferedImage i = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
		Graphics g = i.getGraphics();
		this.paintComponents(g);
		try {
			ImageIO.write(i, "png", new File("C:\\output.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Hierzu mal ne Frage: Wie schaffe ich das denn mit einem Component, der nicht angezeigt wird?
 

thE_29

Top Contributor
Doch ;)

Wenn die Komponente NICHT angzeigt wird, malt der nix rauf..

Trick: Du machst dir nen JDialog und den setzt du auf setUndecorated(true) und dann haust du dort die Komponenten rauf was du abspeichern willst!

Vorher sagst du noch setLocation(-1000,-1000); und dann setVisible(true); und dann kannst du es via paintComponents(g) malen lassen :)
 

Wildcard

Top Contributor
Hobbit_Im_Blutrausch hat gesagt.:
Doch, weil die Componente so keine Größe und scheinbar auch keinen Inhalt hat.
Meinst du jetzt mit einer Komponente die nie sichtbar war?
Da ist wohl manuelles Layout, aber nachdringliches Bitten beim Manager angesagt.
 

The_S

Top Contributor
@thE_29

Hm, das wäre natürlich ein Work Around ... werde das erstmal so realisieren, aber das geht doch bestimmt auch noch anders oder?
 

thE_29

Top Contributor
Nein geht nicht... (also am Wissenstand der 1.4er API ;))

Java ist so intelligent und verschleudert keine Resourcen/Rechenaufwand, etc. für Komponenten die nicht angezeigt werden!

Wozu auch?!
 

thE_29

Top Contributor
Was mir gerade einfällt, vielleicht würde es gehen wenn du die isVisible, isShowing, etc. Methoden überschreibst ;)
 

The_S

Top Contributor
Vom Component? Geht leider nicht. Ich schreibe gerade an einer möglichst einfachen API um mit iText (ja, iText is schon verdammt einfach, aber es gibt halt Leute, denen kanns nicht einfach genug sein :roll: ) PDFs generieren zu können. Unter anderem ist es Anforderung, dass man eine beliebige Komponente (egal ob swing oder awt) übergeben kann, welche dann im PDF dargestellt wird. Vondaher ist überschreiben wohl eher nicht geeignet ;) .
 

Wildcard

Top Contributor
Ich hätte jetzt erwartet das man das mit invalidate und validate hinbekommt.
Eine Komponente muss nicht angezeigt werden um Zeichnen zu können wie man an den Tree/Cell-Renderern erkennt.
 

The_S

Top Contributor
Wildcard hat gesagt.:
Ich hätte jetzt erwartet das man das mit invalidate und validate hinbekommt.
Eine Komponente muss nicht angezeigt werden um Zeichnen zu können wie man an den Tree/Cell-Renderern erkennt.

nope, so einfach isses leider nicht :cry:
 

Wildcard

Top Contributor
Proof of Concept (Muss auch irgendwie besser gehen):
Code:
public class Test{
	
	public static void main(String[] args) {
		JLabel label = new JLabel("Test");
		BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
		Graphics g = image.getGraphics();
		label.addNotify();
		label.setBounds(50,50,50,50);
		label.paint(g);
		try {
			ImageIO.write(image, "png", new File("test.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		g.dispose();
	}
}
 

Wildcard

Top Contributor
Statt addNotify funktioniert auch setVisible, allerdings vermute ich das es hier zu Thread-Problemen kommen kann, also nachfolgenden Code sicherheitshalber über invokeLater ausführen.
 

The_S

Top Contributor
Hm, nicht schlecht. Schonmal ein Anfang. Bleibt noch die Frage, wie ich die optimale größe bestimmen kann!?
 

Wildcard

Top Contributor
Code:
	public static void main(String[] args) {
		JLabel label = new JLabel("Test");
		label.setVisible(true);
		label.setSize(label.getPreferredSize());
		BufferedImage image = new BufferedImage(label.getWidth(),label.getHeight(),BufferedImage.TYPE_INT_ARGB);
		Graphics g = image.getGraphics();
		label.paint(g);
		try {
			ImageIO.write(image, "png", new File("test.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		g.dispose();
	}
 

thE_29

Top Contributor
Tjo und setVisible true setzt eben intern diese Schalter auf true, sodaß das painting hinhaut ;)

Die Frage ist, wenn man ein JPanel zeichnen will, muss man da alle Kindkomponenten auch setVisible(true) sagen oder reicht das Hauptpanel aus?!


Aber, wie man sieht gehts auch anders :) Jedenfalls hatte ich recht, das es solange man es nicht anzeigt (setVisible(true)) eben nichts gezeichnet wird über die paint Methode! :)
 

Wildcard

Top Contributor
thE_29 hat gesagt.:
Aber, wie man sieht gehts auch anders :) Jedenfalls hatte ich recht, das es solange man es nicht anzeigt (setVisible(true)) eben nichts gezeichnet wird über die paint Methode! :)
Nein, das wird ja nicht wirklich angezeigt.
Wie oben gezeigt geht es ja auch wenn man addNotify direkt aufruft.
Soll man aber nicht machen, also im zweiten Source setVisible.
Die Frage ist, wenn man ein JPanel zeichnen will, muss man da alle Kindkomponenten auch setVisible(true) sagen oder reicht das Hauptpanel aus?!
Afaik nicht, da es nur darum geht das AWT die Verbindung zu einem OS Handle herstellt.
Wenn ein Label in einen Container eingefügt wird kann es dessen Handle verwenden.
 

The_S

Top Contributor
Also Test mit einem JPanel und 2 Buttons darauf verlief leider erfolglos. D. h. man müsste auf einen Container überprüfen und dann die selbe prodzedur noch mit den subcomponenten ausführen ...
 

Wildcard

Top Contributor
Code:
	public static void main(String[] args) {
		JPanel panel = new JPanel(new FlowLayout());
		
		JLabel label = new JLabel("Test");
		panel.add(label);
		panel.setSize(panel.getPreferredSize());
		panel.setVisible(true);
		panel.doLayout();
		
		BufferedImage image = new BufferedImage(panel.getWidth(),panel.getHeight(),BufferedImage.TYPE_INT_ARGB);
		Graphics g = image.getGraphics();
		panel.paint(g);
		try {
			ImageIO.write(image, "png", new File("test.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		g.dispose();
	}
 

The_S

Top Contributor
Hm, funzt bei mir mit setVisible(true) nicht. Nur mit addNotify. kA warum! Aber es funzt. Herzlichen Dank! :D
 

Wildcard

Top Contributor
Hobbit_Im_Blutrausch hat gesagt.:
Hm, funzt bei mir mit setVisible(true) nicht. Nur mit addNotify. kA warum! Aber es funzt. Herzlichen Dank! :D
Wie gesagt, bei setVisible sehe ich Thread Probleme, also sollte alles nachfolgende mit invokeLater in die Queue gesetzt werden.
 

The_S

Top Contributor
Prob is dann aber, dass es evtl. zu spät ausgeführt wird. Aber mit addNotify gehts ausgezeichnet!
 

Wildcard

Top Contributor
Hobbit_Im_Blutrausch hat gesagt.:
Prob is dann aber, dass es evtl. zu spät ausgeführt wird. Aber mit addNotify gehts ausgezeichnet!
Zu spät? Was meinst du damit?
addNotfiy ist AFAIK nicht ganz ungefährlich. Wenn du die Wahl hast benutz es lieber nicht, wenn du es doch benutzt, pass auf das du es nur einmal aufrufst.
Ansonsten hast du im best case wohl ein Speicherleck und im worst-case gehen evtl. dem OS die Widgets aus ???:L
EDIT:
noch was: wenn du es doch benutzt, unbedingt removeNotify aufrufen.
 

The_S

Top Contributor
Wildcard hat gesagt.:
Zu spät? Was meinst du damit?

Weil diese Operation in einer anderen Methode ausgelagert ist und ich mit einem invokeLater nicht mehr garantieren kann, dass "doLayout" ausgeführt wurde bevor das Image generiert wird.

Wildcard hat gesagt.:
addNotfiy ist AFAIK nicht ganz ungefährlich. Wenn du die Wahl hast benutz es lieber nicht, wenn du es doch benutzt, pass auf das du es nur einmal aufrufst.
Ansonsten hast du im best case wohl ein Speicherleck und im worst-case gehen evtl. dem OS die Widgets aus ???:L

öhm ... joa ... glaub ich dir jetzt einfach mal. Ich hab nämlich keine Ahnung was das genau macht, das Einzige was ich momentan darüber weis ist, dass es funktioniert ;) (wobei ich eigentlich schon gerne weis, was ich eigentlich da zusammenprogrammier).

Wildcard hat gesagt.:
noch was: wenn du es doch benutzt, unbedingt removeNotify aufrufen.

Danke für den Tipp, wird gemacht!
 

The_S

Top Contributor
Jup, hilft aber auch net, kA warum ... denk mal wir bewegen uns hier auf ner ziemlich "abstrakten" Ebene
 

The_S

Top Contributor
Zur Ergänzung nochmal eine viel einfachere Möglichkeit:

Code:
SwingUtilities.paintComponent(graphics2d, component, container, rectangle);
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Java Swing Oberfläche aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
C Swing-Oberfläche wird auf einiges PCs nicht korrekt dargeste AWT, Swing, JavaFX & SWT 19
I Swing-Oberfläche wird nicht korrekt gezeichnet AWT, Swing, JavaFX & SWT 6
S Berechtigungssystem für Swing-Oberfläche AWT, Swing, JavaFX & SWT 2
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben