Avatar billede kasparov Nybegynder
13. december 2001 - 14:50 Der er 1 kommentar og
2 løsninger

Tråde og repaint()

Jeg har problemer med GUI\'en til et program.
Jeg har et JPanel med en paint() metode, som jeg ønsker at opdatere løbende mest programmet kører. Som det er nu, kører selve programmet som en løkke, hvor jeg til sidst i denne løkke kalder repaint() metoden for JPanel\'et - dette dur tilsyneladene ikke. Samtidigt vil jeg gerne kunne \"pause\" programmet, så man kan nå at se hvad der foregår hver gang den bliver repaintet.

Jeg går ud fra at jeg kan løse problemet ved at lave 2 tråde, hvor den ene kører løkken igennem en gang, og hvor den anden repainter JPanelet - samtidigt med at den \"pauser\"(sleep?) i et passende tidsrum.

Da jeg ikke kender ret meget til tråde, ville jeg bare høre, om der var nogen som havde et forslag til hvordan jeg kunne løse ovenstående
Avatar billede kresten Nybegynder
13. december 2001 - 14:59 #1
Det er er lidt indviklet emne, men prøv at se på http://java.sun.com/j2se/1.3/docs/guide/misc/threadPrimitiveDeprecation.html og læs især afsnittet \"What should I use instead of Thread.suspend and Thread.resume\".
Avatar billede larschristensen Nybegynder
13. december 2001 - 15:34 #2
Thread.suspend and Thread.resume i java pakker og er ikke \"god og bruge\"
---------------------------------------

package thread;

/**
* Title:  Data Object for java
* @author ScallyWack
* @version 1.0
*/

public class Entraad extends Thread
{

  private boolean run=true;
  private boolean pause=true;
  private boolean dead=false;
  private long sleepTime=1000;
  private long intervalForUdfoerselAfKode=1000;

  public Entraad()
  {
  }

  public void run()
  {
    try
    {
      while(this.run)
      {
        while(this.pause)
        {
          this.doCode();
          this.sleep(intervalForUdfoerselAfKode);
        }
        this.sleep(sleepTime);//så tjekker tråden ikke hele tiden (tager meget cpu tid)
      }
      this.dead=true;
    }
    catch (Exception e)
    {
      this.dead=true;
      System.err.println(e);
    }
  }

  private void doCode()
  {
    //impl din code
  }

  public void doSleep()
  {
    this.pause=false;//hopper ud af løkke
  }

  public void wakeUp()
  {
    this.pause=true;//kommer ind i løkke igen
  }

  public void stopThread()
  {
    this.run=false;//tråd løber ud
  }

  public boolean isDead()//er tråden helt færdi
  {
    return this.dead;
  }
}
---------------------------------------
hvis det er sådan noget du leder efter ...tage
har selv prøvet og bruge nogle af de ting java pakkerne,for og finde ud af at ikke alle ting er impl
Avatar billede logical Nybegynder
14. december 2001 - 09:20 #3
Glem tråde, brug istedet en anden mekanisme:

JComponent.paintImmediately(Rectangle r); // Eller x,y,w,h som args

Du tager fat i en komponent, og ber om at følgende rectangle inde i den skal gentegnes.

Hvis du bare har ændret noget i din JPanel, kan du bare kalde:
panel.paintImmediately(panel.getBounds());

Hvis det er animation, og dit panel har flyttet location, skal du huske at finde den komponent, som er nedenunder og få den gentegnet igen, etc...
Her er et eksempel på en simpel Sprite klasse, den tillader objekter at flytte lokation:
public class Sprite extends JLabel{
    public Sprite(ImageIcon icon) {
        super(icon);
        setSize(icon.getIconWidth(), icon.getIconHeight());
    }

    public void flyTo(int x, int y) {
        // Reference the before and after rectangle.
        Rectangle r = getBounds();
        setLocation(x, y);
        Rectangle r2 = getBounds();

        // locate outer container (if any) and repaint component       
        Container c = SwingUtilities.getAncestorOfClass(Container.class, this);
        if (c instanceof JComponent) {
            JComponent jc = (JComponent) c;
            jc.paintImmediately(r);
            jc.paintImmediately(r2);
        } else if (c != null){
            invalidate();
            c.validate();
            c.repaint();
        }
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester