Avatar billede jannek_ek Nybegynder
31. august 2005 - 19:01 Der er 25 kommentarer og
1 løsning

tråd skal referere til hovedprogrammet

jeg har et program, med en tråd. den tråd skal kunne kalde repaint() i hovedvinduet. hvordan gør man det?

og så lige noget om funktionen stop(), kan der være problemer med at bruge den hvis tråden skal køres igen/hvordan løses disse problemer?
Avatar billede arne_v Ekspert
31. august 2005 - 19:13 #1
hvis du sender en refernce til din JFrame med over i constructor på Thread/Runnable
klassen som gemmer den så kan run metoden kalde metoder på din JFrame
Avatar billede arne_v Ekspert
31. august 2005 - 19:13 #2
jeg plejer altid at lave en ny tråd jeg har aldrig forsøgt at genstarte
Avatar billede jannek_ek Nybegynder
31. august 2005 - 19:24 #3
det er den første tråd jeg laver, så du må meget gerne komme med et eksempel på en reference.

mener du new Thread(...) eller start() stop() start() stop()??
Avatar billede arne_v Ekspert
31. august 2005 - 19:36 #4
et gammelt eksempel:

package august;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;

public class DynNum extends JFrame implements ActionListener {
  private JTextArea txt;
  private JButton btn;
  public DynNum() {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      getContentPane().setLayout(new GridLayout(2, 1));
      txt = new JTextArea();
      getContentPane().add(txt);
      btn = new JButton("Start");
      btn.addActionListener(this);
      getContentPane().add(btn);
      pack();
  }
  public void addNum(int n) {
      txt.setText(txt.getText() + " " + n + "\r\n");
      pack();
  }
  public void actionPerformed(ActionEvent ev) {
      if (ev.getSource() == btn) {
        T t = new T(this);
        t.start();
      }
  }
  public static void main(String[] args) {
      DynNum f = new DynNum();
      f.show();
  }
}

class T extends Thread {
  private DynNum dn;
  public T(DynNum dn) {
      this.dn = dn;
  }
  public void run() {
      Random rng = new Random();
      for(int i = 0; i < 10; i++) {
        dn.addNum(rng.nextInt(100));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
      }
  }
}
Avatar billede jannek_ek Nybegynder
31. august 2005 - 20:44 #5
hmm jeg kan ikke lige se mig ud af det, så du får lige min kode:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

thread:

public class automatisk extends lytTilMusen implements Runnable
{
 
  public automatisk()
  {
   
  }
 
  public void run()
  {
    try
    {
      Thread.sleep(1000);
    } catch (Exception e)
    {}
    repaint();
  }
}

apletten:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;

public class lytTilMusen extends Applet
{
  public Point punkt;
  public Rectangle kasse = new Rectangle(225,225,50,50);
  public int liv = 25;
  public int points;
  public boolean klik;
  public boolean igang;
  public Thread tiden = new Thread(new automatisk());
 
  public void flytKassen()
  {
    kasse.x = (int) (Math.random() * 450);
    kasse.y = (int) (Math.random() * 450);
  }
 
  public lytTilMusen()
  {
    muselytter lytter = new muselytter();
    lytter.felt = this;
    this.addMouseListener(lytter);
  }
 
  public void paint(Graphics g)
  {
    if(klik && liv > 0)
    {
      if(kasse.contains(punkt))
      {
        igang = true;
        points++;
      } else
      {
        igang = true;
        liv--;
      }
      tiden.stop();
      klik = false;
    } else
    {
      if(igang)
      {
        liv--;
      }
    }
    if(liv < 0)
    {
      igang = false;
      g.setColor(Color.black);
      g.drawString("Du har tabt, men nåede at få "+points+" points.", 15, 15);
    } else {
      if(igang)
      {
        flytKassen();
        tiden.start();
      }
      g.setColor(Color.red);
      g.fillRect(kasse.x, kasse.y, kasse.width, kasse.height);
      g.setColor(Color.black);
      g.drawString("Du har "+liv+" liv tilbage, og "+points+" points.", 15, 15);
    }
  }
}
Avatar billede jannek_ek Nybegynder
31. august 2005 - 20:45 #6
jeg kan godt kompilere det, men browseren crasher når jeg kører det
Avatar billede arne_v Ekspert
31. august 2005 - 20:48 #7
public class automatisk extends lytTilMusen implements Runnable
{
  private JFrame f;
  public automatisk(JFrame f)
  {
    this.f = f;
  }

  public void run()
  {
    try
    {
      Thread.sleep(1000);
    } catch (Exception e)
    {}
    f.repaint();
  }
}

og

public Thread tiden = new Thread(new automatisk(this));

vil jeg tro
Avatar billede arne_v Ekspert
31. august 2005 - 20:49 #8
Avatar billede jannek_ek Nybegynder
31. august 2005 - 20:54 #9
.\automatisk.java:7: cannot resolve symbol
symbol  : class JFrame
location: class automatisk
  private JFrame f;
          ^
.\automatisk.java:9: cannot resolve symbol
symbol  : class JFrame
location: class automatisk
  public automatisk(JFrame f)
                    ^

den klager over JFrame
men nej jeg har ikke læst artiklen, læser den lige
Avatar billede arne_v Ekspert
31. august 2005 - 20:57 #10
sorry - det er ikke JFrame men Applet du bruger - bare erstat JFrame med Applet
Avatar billede jannek_ek Nybegynder
31. august 2005 - 21:01 #11
hmm nu kan det kompileres, men så crasher det igen...
Avatar billede arne_v Ekspert
31. august 2005 - 21:34 #12
hvorfor og hvor crasher den ?

kan ses i Java Console
Avatar billede jannek_ek Nybegynder
31. august 2005 - 21:39 #13
java.lang.StackOverflowError
    at java.awt.Component.<init>(Unknown Source)
    at java.awt.Container.<init>(Unknown Source)
    at java.awt.Panel.<init>(Unknown Source)
    at java.awt.Panel.<init>(Unknown Source)
    at java.applet.Applet.<init>(Unknown Source)
    at lytTilMusen.<init>(lytTilMusen.java:23)
    at automatisk.<init>(automatisk.java:10)
    at lytTilMusen.<init>(lytTilMusen.java:14)
    at automatisk.<init>(automatisk.java:10)

        osv osv osv

    at lytTilMusen.<init>(lytTilMusen.java:14)
Exception in thread "Thread-5" java.lang.NullPointerException
    at sun.plugin.util.GrayBoxPainter.showLoadingError(Unknown Source)
    at sun.plugin.AppletViewer.showAppletException(Unknown Source)
    at sun.applet.AppletPanel.runLoader(Unknown Source)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
    at sun.plugin.util.GrayBoxPainter.showLoadingError(Unknown Source)
    at sun.plugin.AppletViewer.showAppletStatus(Unknown Source)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "thread applet-lytTilMusen.class" java.lang.NullPointerException
    at sun.plugin.util.GrayBoxPainter.showLoadingError(Unknown Source)
    at sun.plugin.AppletViewer.showAppletException(Unknown Source)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
java.lang.StackOverflowError
    at java.awt.FlowLayout.<init>(Unknown Source)
    at java.awt.FlowLayout.<init>(Unknown Source)
    at java.awt.Panel.<init>(Unknown Source)
    at java.applet.Applet.<init>(Unknown Source)
    at lytTilMusen.<init>(lytTilMusen.java:23)
    at automatisk.<init>(automatisk.java:10)
    at lytTilMusen.<init>(lytTilMusen.java:14)
    at automatisk.<init>(automatisk.java:10)
    at lytTilMusen.<init>(lytTilMusen.java:14)

        osv osv osv
Avatar billede jannek_ek Nybegynder
31. august 2005 - 21:40 #14
altså den gentager det her rigtig meget

    at automatisk.<init>(automatisk.java:10)
    at lytTilMusen.<init>(lytTilMusen.java:14)
    at automatisk.<init>(automatisk.java:10)
    at lytTilMusen.<init>(lytTilMusen.java:14)
Avatar billede arne_v Ekspert
31. august 2005 - 21:45 #15
umiddelbart lyder det som du har lavet en uendelig rekursion i automatisk og
lytTilMusen constructorerne

hvordan ser kode ud nu ?
Avatar billede jannek_ek Nybegynder
31. august 2005 - 21:58 #16
automatisk:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class automatisk extends lytTilMusen implements Runnable
{
  private Applet f;
 
  public automatisk(Applet f)
  {
    this.f = f;
  }
 
  public void run()
  {
    try
    {
      Thread.sleep(1000);
    } catch (Exception e)
    {}
    f.repaint();
  }
}


og lytTilMusen:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class lytTilMusen extends Applet
{
  public Point punkt;
  public Rectangle kasse = new Rectangle(225,225,50,50);
  public int liv = 25;
  public int points;
  public boolean klik;
  public boolean igang;
  public Thread tiden = new Thread(new automatisk(this));
 
  public void flytKassen()
  {
    kasse.x = (int) (Math.random() * 450);
    kasse.y = (int) (Math.random() * 450);
  }
 
  public lytTilMusen()
  {
    muselytter lytter = new muselytter();
    lytter.felt = this;
    this.addMouseListener(lytter);
  }
 
  public void paint(Graphics g)
  {
    if(klik && liv > 0)
    {
      if(kasse.contains(punkt))
      {
        igang = true;
        points++;
      } else
      {
        igang = true;
        liv--;
      }
      tiden.stop();
      klik = false;
    } else
    {
      if(igang)
      {
        liv--;
      }
    }
    if(liv < 0)
    {
      igang = false;
      g.setColor(Color.black);
      g.drawString("Du har tabt, men nåede at få "+points+" points.", 15, 15);
    } else {
      if(igang)
      {
        flytKassen();
        tiden.start();
      }
      g.setColor(Color.red);
      g.fillRect(kasse.x, kasse.y, kasse.width, kasse.height);
      g.setColor(Color.black);
      g.drawString("Du har "+liv+" liv tilbage, og "+points+" points.", 15, 15);
    }
  }
}
Avatar billede arne_v Ekspert
31. august 2005 - 22:02 #17
hvordan ser muselytter constructor ud ?
Avatar billede jannek_ek Nybegynder
31. august 2005 - 22:04 #18
sådan:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class muselytter implements MouseListener
{
  public lytTilMusen felt;

  public void mousePressed(MouseEvent me)
  {
    felt.punkt = me.getPoint();
    felt.klik = true;
    felt.repaint();
  }
  public void mouseReleased(MouseEvent me)
  {}
  public void mouseClicked(MouseEvent me)
  {}
  public void mouseEntered(MouseEvent me)
  {}
  public void mouseExited(MouseEvent me)
  {}
}

men jeg regnede ikke med at den havde noget med det andet at gøre.
Avatar billede arne_v Ekspert
31. august 2005 - 22:23 #19
ok

du laver en lyTilMusen

den laver

  public Thread tiden = new Thread(new automatisk(this));

som kalder automatisk constructor som starter med at lave en
lytTilMusen fordi det er basis klassen

og så kører det i uendelig løkke
Avatar billede arne_v Ekspert
31. august 2005 - 22:24 #20
lad være med at arve

altså:

public class automatisk implements Runnable
Avatar billede jannek_ek Nybegynder
31. august 2005 - 22:37 #21
jahh det var første del hehe
nu er der bare det der med hvordan jeg skal stoppe og starte tråden, for nu virker timeren een gang, og så holder den op med at virke
Avatar billede arne_v Ekspert
31. august 2005 - 22:42 #22
hvis den skal blive ved med at køre - er det så ikke

  public void run()
  {
  while(true) {
    try
    {
      Thread.sleep(1000);
    } catch (Exception e)
    {}
    repaint();
  }
  }
Avatar billede jannek_ek Nybegynder
31. august 2005 - 22:44 #23
jamen den skal jo startes forfra hver gang der bliver klikket med musen
Avatar billede arne_v Ekspert
31. august 2005 - 22:47 #24
så skal du vel lave en

tiden = new Thread(new automatisk());
tiden.start();

ved klik ?
Avatar billede jannek_ek Nybegynder
31. august 2005 - 22:50 #25
JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Så virker det :D
Tusind tak for hjælpen! Og kom med et svar så du kan få dine velfortjente points :D
Avatar billede arne_v Ekspert
31. august 2005 - 22:52 #26
svar
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