AWT Wann ist paint() fertig?

Status
Nicht offen für weitere Antworten.

hdw

Mitglied
Hallo zusammen,

ich bin Neuling und versuche eine "Animation" zu basteln, aber ich habe noch folgendes Problem:
In der Animation (realisiert mit AWT, in einem eigenen Thread mit DoubleBuffering bei ca. 5Hz) werden pro Bildaufbau () einige tausend Linien gezeichnet.
Da die Wiederholrate nicht wirklich kritisch ist, möchte ich das Programm dazu bringen, zu erkennen wann paint() fertig ist, d.h. wann die letzte Linie gezeichnet wurde. Aber ich fand bisher nichts Elegantes das Ende von paint zu erkennen.

paint läuft vermutl. innerhalb der AWT-EventQueue-0, ist aber kein eigener Thread, den ich z.B. mit join() abwarten könnte.

Meine einzige Anfänger-Idee:
Ich zähle einfach die zu zeichnenden Linien innerhalb von paint und verwende ein Flag, das das Ende paint an den Haupt Thread signalisiert. Aber wirklich schön finde ich das nicht.

Gibt es bessere Ideen? Bietet Swing hier etwas?

Danke und Gruss, Holger
 

Schandro

Top Contributor
du könntest am Ende der paint-Methode einen neuen Thread starten, in dem du dann das ausführen kannst was nach beenden der paint-Methode ausgeführt werden soll.

Warum der umweg über nen neuen Thread? Weil du ansonsten den EDT blockierst.
 

hdw

Mitglied
das ging ja schnell :)

Am Ende des paint() Aufrufes beginnt die Schleife des Haupt-Threads von neuem: Berechnung aller Linien und Projektion auf die Frame-Koordinaten, dann repaint(). Viel mehr ist in dieser Schleife nicht drin.
Den Haupt-Thread wollte ich nicht nach jedem Bildaufbau beenden und neu starten. Aber vielleicht muss ich noch mal darüber meine Programm-Architektur nachdenken...

Wenn ich nach paint() einen neuen Thread starte ohne meinen Haupt-Thread zu beenden, dann kann ich diesen neuen Thread eigentl. auch nur nutzen, um dem main-Thread zu signalisieren, dass paint fertig ist? Oder hab ich jetzt alles misverstanden?
 

Schandro

Top Contributor
Poste doch bitte mal den kompletten Code.

Ansonsten:
Den Haupt-Thread wollte ich nicht nach jedem Bildaufbau beenden und neu starten. Aber vielleicht muss ich noch mal darüber meine Programm-Architektur nachdenken...
Wie wärs mit ner Schleife innerhalb des Threads? Natürlich muss Thread.sleep auch innerhalb dieser Schleife stehen.
 

hdw

Mitglied
dann versuch ich mal mein Glück mit dem Code, hoffe es hilft:

Java:
  // code skipped...

  /**
   * main loop - display thread
   */
  public void run()
  {    
    long tStart   = 0;               // start time in ms
    long tElapsed = 0;               // end of processing/frame update etc.

    while (true) {
      tStart = getTimeInMillis();    // get loop time stamp

      center = communicator.getLatLon(); // get latest center position in lat/lon coords from network
      projection2frame(center);      // calculate projection to frame pixel
      repaint();                     // update frame display

      tElapsed = getTimeInMillis() - tStart;
      if (tElapsed < CYCLETIME) {
        mySleep(CYCLETIME - tElapsed); // sleep if spare time avail.
      }
    }
  } // end run()

  /**
   * update off-screen/double buffer
   */
  public void update (Graphics g) {
    // initialize double buffer
    int width  = this.getSize().width;
    int height = this.getSize().height;

    if (dbImage == null) {
      dbImage    = createImage(width, height);
      dbGraphics = dbImage.getGraphics();
    } // end if (dbImage == null)

    // delete background
    dbGraphics.setColor(getBackground());
    dbGraphics.fillRect(0, 0, width, height);

    // draw foreground
    dbGraphics.setColor(getForeground());
    paint(dbGraphics);

    // display offscreen
    g.drawImage(dbImage, 0, 0, this);    
  } // end update

  /**
   * paint method for window
   */
  public void paint(Graphics g)
  {
    Color col;
    int drawCount = 0;
    ColoredLineCartesian2D line;
    Iterator lineIterator = screenLineArray.iterator();
    while (lineIterator.hasNext()) {
      line = (ColoredLineCartesian2D)lineIterator.next();
      // draw updated line if within clipping area
      drawCount++;  // track lines to draw FIXME
      g.setColor(line.getColor());
      g.drawLine((int)line.getLine()[0][0],
                 (int)line.getLine()[0][1],
                 (int)line.getLine()[1][0],
                 (int)line.getLine()[1][1]);
    } // end while iterate screenLineArray
  } // end public void paint
  
  // more code skipped

Noch ein paar Worte zur Erkärung:
Die Aufruf von repaint() kommt innerhalb von ca. 10-20 Millisekunden zurück. Aber paint() ist nicht annähernd so schnell fertig mit dem Zeichnen aller Linien. Genau dieses Weiterlaufen von paint() möchte ich erkennen können.

Eigentlich liest das Programm Koordinaten vom Netzwerk und eine Art Landkarte aus einem File.
Mit getLatLon() werden die aktuellen Beobachter-Koordinaten vom Netzwerk gelesen.
In projection2frame() werden Landkarten-Linien entspr. der Beobachterposition neu zentriert und dann auf die Frame Koordinaten projeziert/skaliert.
Dann wird der Bildaufbau mit repaint angestoßen.
Schliesslich wird noch etwas geschlafen (mySleep), falls noch Zeit übrig ist.

Zu update hab ich nicht viel zu sagen, hab ich im Internet gefunden, realisiert nur den DoubleBuffer um das Flackern zu vermeiden.

Paint iteriert nur über eine ArrayList aller Linien. Jede Linie hat jew. Anfangs- und Endkoordinaten (x/y) plus Farbe.

Edit:
Wenn man das Ende von paint() nicht rechtzeitig erkennt, dann wird durch den nächsten Durchlauf der Schleife der Buffer gelöscht, bevor er vollständig gezeichnet wurde. Das Ergebnis ist dann eine unvolständige Landkarte :(
 
Zuletzt bearbeitet:

Schandro

Top Contributor
Ok, ich denk ich weiß jetzt was du willst^^

Beispielcode:
[JAVA=8]public class XXX{

public static void main(String[] args){
new XXX();}


private JFrame window = new JFrame();
private volatile Object o23 = new Object(); // existiert nur um darauf wait und notifyAll aufzurufen

public XXX(){
window.setBounds(100,100,400,400);
window.add(panel);

SwingUtilities.invokeLater(new Runnable() {
public void run() {
window.setVisible(true);
}
});

// der "mainThread"
new Thread(new Runnable(){
public void run(){
while(true){

panel.repaint();

try{
synchronized(o23){
o23.wait();
}
}catch(InterruptedException e){
e.printStackTrace();
}

// hier gehts erst weiter wenn paint fertig ist

}
}
}).start();
}


JPanel panel = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);

// malt viel Zeug, wird hier durch Thread.sleep dargestellt
try{Thread.sleep(50);}catch(InterruptedException e){e.printStackTrace();}

// weckt am Schluss den mainThread wieder auf
synchronized(o23){
o23.notifyAll();
}
}
};

}[/code]
 
Zuletzt bearbeitet:

hdw

Mitglied
Hi,
o.k., ich glaube ich verstehe das Prinzip Deines Beispiels. Das sollte ja in analoger Weise auch für AWT realisierbar sein. Ich werde es jedenfalls ausprobieren.
Danke jedenfalls fuer Deine super-schnelle Hilfe. :) Das macht Mut bald mal wieder hier reinzuschauen.
Hab als Anfänger ja noch viele Fragen...
Danke + :applaus:
 

hdw

Mitglied
Hallo,
nachdem ich den mainThread nun mit wai() auf ein Dummy-Snchronized Object so lange warten lasse, bis paint() fertig ist, läuft der eigentl. paint() um ca. den Faktor 5-10 schneller :) .
Vielleicht hilft dieser Tipp jemandem, der paint() fuer eine Animation beschleunigen will und noch etwas CPU-Reserven hat.

In meinem ursprünglichen Ansatz hatte ich nur ein Thread.sleep(time) in meinem main-Thread nach jedem Schleifendurchlauf.
In meinem neuen Ansatz gibt es nun im main-Thread zusätzlich noch ein wait() solange paint() läuft. Das scheint zumind. in meinem Fall performanter zu sein.
Danke Schandro.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
R wann liefert getEditingRow was brauchbares ? AWT, Swing, JavaFX & SWT 2
K Swing Wann benötigt man JFrames? AWT, Swing, JavaFX & SWT 5
M SWT /Jface Wann einen ColumnLabelProvider benutzen? AWT, Swing, JavaFX & SWT 2
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
B Swing JScrollPane - observen wann eine JScrollBar angezeigt wird? AWT, Swing, JavaFX & SWT 5
S Listener der mich informiert wann immer einer Liste ein Element hinzugefuegt wird? AWT, Swing, JavaFX & SWT 4
I Swing Wann invokeLater() verwenden? AWT, Swing, JavaFX & SWT 7
G Abfragen, wann JFrame dargestellt ist AWT, Swing, JavaFX & SWT 3
H Benachrichtigt werden wann ein Container repainted wird? AWT, Swing, JavaFX & SWT 5
I Wann genau startet der AWT-Thread? AWT, Swing, JavaFX & SWT 3
M AbstractAction, wann benutzen? AWT, Swing, JavaFX & SWT 2
T Fenster verschieben => Wann fertig? AWT, Swing, JavaFX & SWT 8
S Wann brauche ich die prepareRenderer() Methode ? AWT, Swing, JavaFX & SWT 2
T invokeLater - Wann? AWT, Swing, JavaFX & SWT 29
M Wann AbstractTableModel und wann DefaultTableModel AWT, Swing, JavaFX & SWT 4
M wann wird paintComponent() aufgerufen AWT, Swing, JavaFX & SWT 4
E Problem mit JPanel - Wann wird size berechnet? AWT, Swing, JavaFX & SWT 5
A Swing: Wann ist eine Komponente gezeichnet? AWT, Swing, JavaFX & SWT 2
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
U Was ist der Unterschied von paint und paincomponent? AWT, Swing, JavaFX & SWT 3
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
L Berechnungen in paint AWT, Swing, JavaFX & SWT 8
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
S paint() verzögern AWT, Swing, JavaFX & SWT 9
K AWT begrenzte anzahl paint aufrufe AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Hostkomponentengröße in paint AWT, Swing, JavaFX & SWT 2
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
E Warum übermalt paint das ganze Fenster? AWT, Swing, JavaFX & SWT 15
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
H paint überlappend AWT, Swing, JavaFX & SWT 5
E paint AWT, Swing, JavaFX & SWT 3
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
S JCheckBox Paint AWT, Swing, JavaFX & SWT 7
F AWT Probleme mit der paint() methode AWT, Swing, JavaFX & SWT 2
C Unterschiedlicher Aufruf der paint() Methode ? (AWT/Swing) AWT, Swing, JavaFX & SWT 2
L Problem mit paint Methode und Bild AWT, Swing, JavaFX & SWT 7
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
K AWT paint wird nicht aufgerufen AWT, Swing, JavaFX & SWT 7
R LayoutManager Image Paint + Text Panel AWT, Swing, JavaFX & SWT 10
F paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
radiac Swing JFrame - paint(g) - FrameObjects bei activeRendering AWT, Swing, JavaFX & SWT 3
I AWT paint() in MouseEvent aufrufen klappt nicht AWT, Swing, JavaFX & SWT 8
T paint() wird zweimal ausgeführt AWT, Swing, JavaFX & SWT 6
hdi Swing JLabel & paint-Methode gemixt - wie schlimm wirklich? AWT, Swing, JavaFX & SWT 5
N Paint methode anhalten und neustarten AWT, Swing, JavaFX & SWT 5
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
M Allgemeines zur paint Methode AWT, Swing, JavaFX & SWT 5
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2
K repaint() ruft paint() nicht auf AWT, Swing, JavaFX & SWT 14
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
bugmenot paint() verzögert ausgeführt? AWT, Swing, JavaFX & SWT 4
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
H paint verwenden AWT, Swing, JavaFX & SWT 3
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
A Paint funktioniert nicht richtig AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben