Announcement

Collapse
No announcement yet.

Swing + Thread

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

  • Swing + Thread

    Hallo!
    Habe folgende Klassen;
    eine gui Klasse, die von JFrame abgelitten ist, und Knöpfe und so erzeugt.
    eine OvalKlasse extends pfeilKlasse,die Ovale mit der Methode paintComponent erzeugt.
    eine PfeilKlasse die von JPanel abglitten ist sowie die Schnittstelle Runnable implementiert.
    Nun möchte ich Pfeile zwischen den Ovalen zeichnen, nachdem die Ovale eingezeichnet sind.
    Aber es klappt nicht. Ich habe in der void run() repaint(Graphics s) angegeben, und es wird sogar
    die Methode ausgeführt, aber leider sind keine Pfeile zu sehen.
    Hat jemand eine Idee.
    Danke im Voraus.

    public void run()

    { int zaehler=0;
    while(Thread.currentThread()==Animator)
    {System.out.println("hier der Thread" +zaehler + x_koordinate[2]);
    if(zaehler<=6)
    this.pr_von=zaehler+1;
    this.pr_nach=zaehler+2;

    update(g);


    zaehler++;

    try
    {
    Thread.sleep(1000);
    }
    catch(InterruptedException e)
    {break;}



    }



    }






    public void stop()
    {Animator=null;}



    //start der Pfadanimation
    public void animationStart(){
    Animator=new Thread(this);
    Animator.start();
    Animator.run();
    }

    //zeichnen
    public void update(Graphics g) {

    System.out.println("hier bei pfeilen" );
    this.g.setColor(Color.green);
    g.drawLine(x_koordinate[pr_von-1],y_koordinate[pr_von-1],x_koordinate[pr_nach-1],y_koordinate[pr_nach-1]);


    }

  • #2
    Swing-Aktionen dürfen nur im AWT Dispatch Thread durchgeführt werden.<br>
    Wenn Du also einen "normalen" Thread hast, der zeichnen will, so musst<br>
    Du in diesem Thread
    <pre><code>
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    // hier Swing-Operationen aufführen
    }
    );
    </code></pre>
    verwenden.
    <p>
    Klau

    Comment


    • #3
      Hallo,

      wenn schon invokeLater, dann sollte man es so wie es in der Literatur
      empfohlen wird einsetzen:

      <pre>
      SwingUtilities.invokeLater(new Runnable()
      {
      public void run()
      {
      }
      });
      </pre>

      Intern wird schon EventQueue aufgerufen, aber um Irritationen zu vermeiden ist es wohl besser SwingUtilities zu verwenden.

      Thoma

      Comment

      Working...
      X