Java Canvas Zeichnen

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.
 
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 :p
 
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
 
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?
 
Grob gesagt tut die repaint()-Methode nichts anderes als die paint()-Methode auszurufen.

MFG

Sascha
 
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
 
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.
 
Ich würde sogar sagen lieber paintImmediatly(int x, int y, int w, int h) statt paint(). Hab damit viel bessere Erfahrungen gemacht.
 
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:

Java:
       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:

Java:
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
 

Neue Beiträge

Zurück