Announcement

Collapse
No announcement yet.

Grafikausgabe in Canvas

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Grafikausgabe in Canvas

    Ich will von einem Programm Grafiken in eine Subklasse von Canvas ausgeben. Dabei habe ich zwei Probleme: wenn ich repaint() aufrufe, dann wird das nur ausgefuehrt wenn ich das Fenster verdecke und wieder freigebe. Wenn ich nun
    update() und paint() explizit aufrufe, kann ich komischerweise den thread nicht mehr stoppen, d.i. public void stop() wird ausgefuehrt aber der Thread stoppt denoch nicht.

  • #2
    Hi, Florian.

    Ich vermute, die Ablauflogik deines Programmes ist etwas fehlerhaft, so daß nicht einer sondern viele Threads erzeugt werden:

    Zunächst zu den Methoden paint(), update() und repaint():<br>
    <ul>
    <li>paint() zeichnet die Grafik.</li>
    <li>update() löscht die Anzeige <b>und</b> ruft paint() auf.</li>
    <li>repaint() <it>bittet</it> darum, daß update() aufgerufen wird, d.h. update(9 wird aufgerufen, sobald genügend Systemresourcen frei sind (i.a. sofort).</li>
    </ul>

    Wenn du die Grafik verbirgst und wieder zur Anzeige bringst, wird die paint() Methode aufgerufen (und nicht update() und nicht das von dir aufgerufene repaint()).

    Wenn du update() <b>und</b> paint() aufrufst, wird paint() zweimal ausgeführt.

    Deswegen vermute ich, daß du deinen Thread in der paint()- oder in der update()-Methode erzeugst(?!?), denn das würde eine Erklärung für beide Probleme liefern: Viele Threads werden erzeugt, stop() und repaint() werden aber nur für den gerade referenzierten Thread aufgerufen.

    Folgendes Vorgehen ist zu empfehlen:<br>
    Die Referenz

    Thread deinThread;

    auf den Thread solltest du als globale Variable deiner Klasse deklarieren, im Konstruktor deiner Canvas-Subklasse erzeugst du den Thread, in der run()-Methode (die des Runnable-Objekts, mit der du den Thread erzeugt hast, bzw. die Methode deiner Thread-Subklasse, je nach deiner Realisierung existiert eine dieser Möglichkeiten) nimmst du die Bedingung

    while((Thread.currentThread() == deinThread) & (irgendwasAnderes)){<br>
    //machWas<br>
    }<br>
    deinThread.stop();<br>
    deinThread=null;<br>

    auf.

    Ich hoffe, daß ich nicht völlig vorbeigeschossen habe.

    Gruß,Christia

    Comment


    • #3
      Ich kenne Probleme mit repaint!!! Ich habe eine Applet Head.class.
      Auf dem Applet sind Knöpfe verankert und mit einem Event-Handler belegt.

      Und dann noch zwei Klassen Canvas. Diese haben beide eine eigene paint- Methode und arbeiten ueber eigene Threads. Das Problem ist, dass beim laufenden Programm die repaint- Aufrufe unterdrückt werden.
      Warum wurde mir schon berichtet. Nur wie ich das geaendert kriege, weiss ich nicht!

      Ich dachte, weil der Eventhandler ein Thread meiner Applet- Klasse ist, hat der mit den Methoden der Canvas nix zu tun. I R R T U M !!!
      dringend HILFE gesucht!!!

      Danke Marco

      Comment

      Working...
      X