-
28.05.08 09:41 #1
- Registriert seit
- Sep 2007
- Beiträge
- 50
Hallo alle miteinander.
Aufbau:
Ich versuche ein Programm zu schreiben auf dem ich Ausgaben über ein Graphics Objekt erstellen lasse. Die von mir dazu erstellte Klasse heisst nach dem was sie später auch machen soll FormPrintPreview. In dieser Klasse sind zwei Komponenten hinterlegt ein JFrame und Canvas Objekt.
Vorhaben / Ablauf:
Ich will als erstes das ganze zeichnen, danach dieses Fenster anzeigen lassen als PrintPreview und dann auf dem Fenster für die PrintPreview auswählen lassen ob er die Vorschau drucken will oder das Fenster lieber wieder schliessen will!!
Hierbei habe ich zwei Varianten ausprobiert:
erste Möglichkeit:
- Wenn ich nur das JFrame nehme und darauf zeichne dann verschwindet die Zeichnung kurz nach dem öffnen der Oberfläche wieder. (Bruchteil einer sekunde)
zweite Möglichkeit:
Das Canvas Objekt füge ich dem Frame hinzu und hole mir für das Zeichnen das Graphics Objekt des Canvas um darauf zu Zeichnen. Hierbei zeigt er mir nichts an. Nicht einmal für eine Sekunde oder so!
Wie kann ich das Problem lösen das er das gezeichnete Bild anzeigt (dauerhaft) bis ich das Fenster schliesse oder auch wenn ich das Fenster mal minimiere und danach wieder maximiere, usw.
Oder was mache ich allgemein Falsch
Cu Nathaniell
-
Was meinst du mit dauerhaft? Verschwindet das Gezeichnete, wenn du das fenster minimierst/maximierst?
Wenn das dein Problem ist, solltest du mit der repaint()-Methode arbeiten.Handlanger des Dr. Ex1tus
Ich kenne Matzes dunkles Geheimnis ! oO
o
L_/
OL
This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat.
Hallo Nuray!
-
28.05.08 09:48 #3
Das liegt daran, dass er das Fenster immer wieder neuzeichnet.
Umgehen kannst du dass, wenn du deine Zeichnung in der repaint() Methode zeichnen lässt.
Am besten zeichnest du alles in ein BufferedImage und lässt dieses dann immer in der repaint() Methode zeichenen.
Oha, da war hammet schneller und schreibt ja doch mal was sinnvolles
"... Jeder von uns ist Kunst... gezeichnet vom Leben" (Casper)
"Sir?, we're sorrounded!"
"Excellent, we can attack in any direction"
-
Hallo,
das ganze in der repaint()-Methode zu zeichnen, ist eigentlich nicht der richtige Weg. Man sollte entweder die paint()-Methode oder paintComponent()-Methode überschreiben.
MFG
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
Wenn man alles in der paint()-Methode zeichnen lässt und anschließend die rapaint()-Methode aufruft, wird doch alles erneuert, oder irre ich mich da?
Handlanger des Dr. Ex1tus
Ich kenne Matzes dunkles Geheimnis ! oO
o
L_/
OL
This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat.
Hallo Nuray!
-
Grob gesagt tut die repaint()-Methode nichts anderes als die paint()-Methode auszurufen.
MFG
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
Nein ist richtig. Es ging nur darum, dass man nicht die repaint-Methode überschreiben sollte.
Siehe auch:public void repaint()
Repaints this component.
If this component is a lightweight component, this method causes a call to this component's paint method as soon as possible. Otherwise, this method causes a call to this component's update method as soon as possible.
Painting in AWT and Swing
-
Eben, und wenn man die paint()-Methode überschreibt und sie per repaint() aufruft sollte das Gezeichnete immer angezeigt werden.
edit// Ja, ok, ich meinte auch nicht, dass mand ie repaint()-methode überschreiben solle. Ich weiß allerdings nicht ob Matze das gemeint hat, wenn ja , habt ihr natürlich recht.Handlanger des Dr. Ex1tus
Ich kenne Matzes dunkles Geheimnis ! oO
o
L_/
OL
This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat.
Hallo Nuray!
-
28.05.08 10:06 #9
Ich würde sogar sagen lieber paintImmediatly(int x, int y, int w, int h) statt paint(). Hab damit viel bessere Erfahrungen gemacht.
"... Jeder von uns ist Kunst... gezeichnet vom Leben" (Casper)
"Sir?, we're sorrounded!"
"Excellent, we can attack in any direction"
-
28.05.08 10:09 #10
- Registriert seit
- Sep 2007
- Beiträge
- 50
Danke schon mal für die Antworten.
Hier erst mal der Code den ich vergssen habe.
Hier der Code um das Objekt PrintPreview auf zu rufen:
Code java:1 2 3 4 5 6 7
FormPrintPreview t = new FormPrintPreview("Drucken Abfrage Bestellliste"); //Graphics g = t.getZeichenFlaeche().getGraphics(); Graphics g = t.getCanvas().getGraphics(); g.drawString("Hallo ich bins der Test!", 50, 50); g.drawOval(90, 90, 100, 100); t.getCanvas().update(g);
Hier der Code der Klasse PrintPreview, aber schon mit eingebundenem Canvas:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
public class FormPrintPreview { private javax.swing.JFrame zeichenflaeche; private java.awt.Canvas canvas; public FormPrintPreview(String TITLE) { this.zeichenflaeche = new javax.swing.JFrame(TITLE); this.zeichenflaeche.setBounds(0, 0, 900, 900); this.zeichenflaeche.setLayout(null); this.zeichenflaeche.setVisible(true); this.zeichenflaeche.setDefaultCloseOperation(this.zeichenflaeche.DISPOSE_ON_CLOSE); // Hintergrund muss weiss werden this.getZeichenFlaeche().getContentPane().setBackground(new java.awt.Color(255,255,255)); this.canvas = new java.awt.Canvas(); this.canvas.setBounds(0, 0, 900, 900); this.canvas.setBackground(new java.awt.Color(255, 255, 255)); this.canvas.setVisible(true); this.zeichenflaeche.add(this.canvas); this.zeichenflaeche.setComponentZOrder(this.canvas, 0); } public javax.swing.JFrame getZeichenFlaeche() { return this.zeichenflaeche; } public java.awt.Canvas getCanvas() { return this.canvas; } }
Warum ist es besser die paint() - Funktion zu überschreiben oder die paintComponent() - Funktion anstatt der repaint() - Funktion?
Das Variable für das BufferedImage würde ich dann in der Klasse PrintPreview als Instanz von BufferedImage anlegen und dann mir dieses nur per get Methode geben lassen oder!?
Cu Nathaniell
-
Lies dir den Artikel durch den ich gepostet habe, dann weißt du warum man nicht repaint überschreiben sollte....
Einfachster Grund: In repaint bekommst du kein Graphics Objekt.
-
28.05.08 10:37 #12
- Registriert seit
- Sep 2007
- Beiträge
- 50
Ok habs verstanden warum nicht die repaint() - Funktion. Ich habe nur solange an meinem neuen Eintrag herum geschrieben das ich deinen Eintrag noch nicht gesehen habe weil ich es nicht zwischendurch aktualisierte.
Aber wie würdet ihr es denn machen BufferedImage in die Klasse mit hinein schreiben als Instanz oder wie? siehe einen Eintrag von mir vorher
Cu Nathaniell
-
28.05.08 11:11 #13
- Registriert seit
- Sep 2007
- Beiträge
- 50
Ich habe die Klasse PrintPreview jetzt umgeschrieben zu:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
public class FormPrintPreview extends javax.swing.JFrame { private java.awt.Canvas canvas; private Vector<java.awt.image.BufferedImage> seiten; private int aktuelleseite; public FormPrintPreview(String TITLE) { this.setTitle(TITLE); this.setBounds(0, 0, 900, 900); this.setLayout(null); this.setVisible(true); this.setDefaultCloseOperation(this.DISPOSE_ON_CLOSE); // Hintergrund muss weiss werden this.getContentPane().setBackground(new java.awt.Color(255,255,255)); this.canvas = new java.awt.Canvas(); this.canvas.setBounds(0, 0, 900, 900); this.canvas.setBackground(new java.awt.Color(255, 255, 255)); this.canvas.setVisible(true); this.add(this.canvas); this.setComponentZOrder(this.canvas, 0); this.seiten = new Vector<java.awt.image.BufferedImage>(); this.aktuelleseite = 0; } public java.awt.Canvas getCanvas() { return this.canvas; } public Vector<java.awt.image.BufferedImage> getSeitenVector() { return this.seiten; } public void addSeite(java.awt.image.BufferedImage SEITE) { if(this.seiten == null) { this.seiten = new Vector<java.awt.image.BufferedImage>(); this.seiten.add(SEITE); } else { this.seiten.add(SEITE); } } }
und der Aufruf sieht so aus:
Code java:1 2 3 4 5 6
FormPrintPreview t = new FormPrintPreview("Drucken Abfrage Bestellliste"); java.awt.image.BufferedImage p = new java.awt.image.BufferedImage(800, 800, java.awt.image.BufferedImage.TYPE_INT_RGB); Graphics2D g = p.createGraphics(); g.drawString("Hallo ich bins der Test!", 50, 50); g.drawOval(90, 90, 100, 100); t.getCanvas().paintAll(g);
Aber das gezeichnete bild zeigt er mir immer noch nicht an
Es liegt wahrscheinlich daran das ich die paint() - Methode noch nicht überschrieben habe!! Aber womit überschreibe ich die paint() - Methode
Oder wo kann ich dazu eine Antwort finden die nicht 42 ist *grins*
Cu Nathaniell
-
Wenn du nicht weißt, wie man Methoden überschreibt solltest du dir vielleicht nochmal die Grundlagen von objectorientierter Programmierung anschauen.
Wenn du grundlegende Fragen hast, wirst du das meiste hier finden
http://www.galileocomputing.de/openbook/javainsel7/
Du überschreibst eine Methode, in dem du eine Klasse von einer anderen Klasse erben lässt und in der neuen Klasse eine Methode schreibst, die es in der Vater-Klasse schon gibt.
z.B.
Code :1 2 3 4 5 6 7 8
public class XPanel extends JPanel{ public void paint(Graphics g){ super.paint(g); g.drawString("test", 10,10); } }
MFG
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
28.05.08 12:37 #15
- Registriert seit
- Sep 2007
- Beiträge
- 50
@Sascha:
Ich weiss wie man Methoden überschreibt ich weiss nur nicht was ich da rein zu schreiben habeGeändert von nathaniells freak (28.05.08 um 12:41 Uhr)
Ähnliche Themen
-
Web Worker - Layoutprozess und Zeichnen in Canvas
Von Danielku15 im Forum Javascript & AjaxAntworten: 0Letzter Beitrag: 10.12.10, 11:01 -
HTML5 - Canvas asynchron zeichnen.
Von Danielku15 im Forum Javascript & AjaxAntworten: 3Letzter Beitrag: 04.10.10, 12:44 -
Array auf Canvas zeichnen
Von DerMaaarkus im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 4Letzter Beitrag: 04.10.10, 12:36 -
Canvas neu zeichnen
Von HTML5er im Forum Javascript & AjaxAntworten: 1Letzter Beitrag: 07.10.09, 18:09 -
Eclipse Plugin, swt Canvas Polynome zeichnen
Von 7mSeni im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 9Letzter Beitrag: 11.07.09, 02:36



1Danke

Zitieren


Login





