tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
Like Tree1Danke
ERLEDIGT
JA
ANTWORTEN
24
ZUGRIFFE
11070
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    nathaniells freak nathaniells freak ist offline Mitglied Silber
    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
     

  2. #2
    Avatar von hammet
    hammet hammet ist offline himekishi
    Registriert seit
    Aug 2006
    Ort
    Bayern
    Beiträge
    334
    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!

  3. #3
    Avatar von Matze
    Matze Matze ist offline Weltenwanderer
    Registriert seit
    Jul 2007
    Ort
    Die Welt
    Beiträge
    1.504
    Blog-Einträge
    7
    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"

  4. #4
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  5. #5
    Avatar von hammet
    hammet hammet ist offline himekishi
    Registriert seit
    Aug 2006
    Ort
    Bayern
    Beiträge
    334
    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!

  6. #6
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Grob gesagt tut die repaint()-Methode nichts anderes als die paint()-Methode auszurufen.

    MFG

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  7. #7
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Nein ist richtig. Es ging nur darum, dass man nicht die repaint-Methode überschreiben sollte.

    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.
    Siehe auch:
    Painting in AWT and Swing
     

  8. #8
    Avatar von hammet
    hammet hammet ist offline himekishi
    Registriert seit
    Aug 2006
    Ort
    Bayern
    Beiträge
    334
    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!

  9. #9
    Avatar von Matze
    Matze Matze ist offline Weltenwanderer
    Registriert seit
    Jul 2007
    Ort
    Die Welt
    Beiträge
    1.504
    Blog-Einträge
    7
    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"

  10. #10
    nathaniells freak nathaniells freak ist offline Mitglied Silber
    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
     

  11. #11
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    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.
     

  12. #12
    nathaniells freak nathaniells freak ist offline Mitglied Silber
    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
     

  13. #13
    nathaniells freak nathaniells freak ist offline Mitglied Silber
    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
     

  14. #14
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  15. #15
    nathaniells freak nathaniells freak ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Beiträge
    50
    @Sascha:

    Ich weiss wie man Methoden überschreibt ich weiss nur nicht was ich da rein zu schreiben habe
    Geändert von nathaniells freak (28.05.08 um 12:41 Uhr)
     

Ähnliche Themen

  1. Web Worker - Layoutprozess und Zeichnen in Canvas
    Von Danielku15 im Forum Javascript & Ajax
    Antworten: 0
    Letzter Beitrag: 10.12.10, 11:01
  2. HTML5 - Canvas asynchron zeichnen.
    Von Danielku15 im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 04.10.10, 12:44
  3. Array auf Canvas zeichnen
    Von DerMaaarkus im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 4
    Letzter Beitrag: 04.10.10, 12:36
  4. Canvas neu zeichnen
    Von HTML5er im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 07.10.09, 18:09
  5. Eclipse Plugin, swt Canvas Polynome zeichnen
    Von 7mSeni im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 9
    Letzter Beitrag: 11.07.09, 02:36