/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Fjerne kurver?
Fra : Torben Svendsen


Dato : 05-01-03 16:53

Kære gruppe

Jeg er ved at lave en applet, der simulerer random walk. Ved hjælp af
Graphics2D og GeneralPath tegner appeletten kurver, der viser, hvor der er
gået. Nu kommer mit problem:

Er der en simpel måde at fjerne de tegnede kurver på? Jeg har prøvet med at
tegne en fyldt kasse, men kurverne ses stadigvæk?

På forhånd tak
Torben Svendsen

http://www.sydjyskvinselskab.dk/



 
 
Ulrik Magnusson (05-01-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 05-01-03 16:58



Torben Svendsen wrote:

> Jeg er ved at lave en applet, der simulerer random walk. Ved hjælp af
> Graphics2D og GeneralPath tegner appeletten kurver, der viser, hvor der er
> gået. Nu kommer mit problem:
>
> Er der en simpel måde at fjerne de tegnede kurver på? Jeg har prøvet med at
> tegne en fyldt kasse, men kurverne ses stadigvæk?

Det lyder underligt - vi må nok hellere se noget kode. (hvis du tegner kurverne

i paint() metoden og tegner den "fyldte kasse" et andet sted, dukker kurverne
op igen senere - fx. ved et manuelt kald til repaint()).

Ulrik Magnusson


Torben Svendsen (05-01-2003)
Kommentar
Fra : Torben Svendsen


Dato : 05-01-03 22:17


"Ulrik Magnusson" <ulrikm@yahoo.com> skrev i en meddelelse
> ... - vi må nok hellere se noget kode ...

Den kommer her:
import java.applet.*;
import java.awt.geom.*;
import java.awt.*;


public class Test extends Applet implements Runnable {
int tid=0;
int max=200;
int step=10;
int offx=250;
int offy=250;
boolean udvisk;
int[] x= new int[max];
int[] y= new int[max];
Thread runner;
Rectangle2D kasse= new Rectangle(0,0,500,500);
GeneralPath vej = new GeneralPath();

public void init() {
setBackground(Color.lightGray);
}

public void paint(Graphics screen) {
Graphics2D screen2D = (Graphics2D) screen;
screen2D.setColor(Color.red);
if (udvisk) {
screen2D.setColor(Color.lightGray);
screen2D.fill(kasse);
screen2D.setColor(Color.red);
}
screen2D.draw(vej);
}

public void start() {
if (runner != null) {
runner = null;
}
runner = new Thread(this);
runner.start();
}

public void run() {
Thread thisThread = Thread.currentThread();
while (runner == thisThread) {
// ruten fastlægges i en for-lykke
udvisk=false;
x[0]=offx;
y[0]=offy;
vej.moveTo(x[0],y[0]);
for (int i=1; i<max; i++) {
try {Thread.sleep(50);}
catch (InterruptedException e) { }
double dummy=Math.random()*4;
if (dummy<1){
x[i]= x[i-1]+step;
y[i]= y[i-1];
} else if (dummy<2){
x[i]= x[i-1];
y[i]= y[i-1]+step;
} else if (dummy<3){
x[i]= x[i-1]-step;
y[i]= y[i-1];
} else {
x[i]= x[i-1];
y[i]= y[i-1]-step;
}
vej.lineTo(x[i],y[i]);
repaint();
}// for-lykke slutter
udvisk=true;
repaint();
} // while-lykke slutter
}

public void stop() {
if (runner != null) {
runner = null;
}
}
}








Ulrik Magnusson (05-01-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 05-01-03 23:05



Torben Svendsen wrote:

> "Ulrik Magnusson" <ulrikm@yahoo.com> skrev i en meddelelse
> > ... - vi må nok hellere se noget kode ...
>
> Den kommer her:
> import java.applet.*;
> import java.awt.geom.*;
> import java.awt.*;
>
> public class Test extends Applet implements Runnable {
> int tid=0;
> int max=200;
> int step=10;
> int offx=250;
> int offy=250;
> boolean udvisk;
> int[] x= new int[max];
> int[] y= new int[max];
> Thread runner;
> Rectangle2D kasse= new Rectangle(0,0,500,500);
> GeneralPath vej = new GeneralPath();
>
> public void init() {
> setBackground(Color.lightGray);
> }
>
> public void paint(Graphics screen) {
> Graphics2D screen2D = (Graphics2D) screen;
> screen2D.setColor(Color.red);
> if (udvisk) {
> screen2D.setColor(Color.lightGray);
> screen2D.fill(kasse);
> screen2D.setColor(Color.red);
> }

// du vil vel kun tegne vejen, hvis den ikke skal viskes ud?:
else{

> screen2D.draw(vej);

}

>
> }
>
> public void start() {
>

// jeg forstår ikke nedenstående, skulle det ikke bare være:
// if( runner != null ){
// runner = new Thread(this);
// runner.start();
// }
// NB! start() bør være synchronized - ellers kan der opstå
// en situation med 2 udførelser af "runner = new Thread();
// runner.start()".


> if (runner != null) {
> runner = null;
> }
> runner = new Thread(this);
> runner.start();
> }
>
> public void run() {
> Thread thisThread = Thread.currentThread();
> while (runner == thisThread) {
> // ruten fastlægges i en for-lykke
> udvisk=false;
> x[0]=offx;
> y[0]=offy;
> vej.moveTo(x[0],y[0]);
> for (int i=1; i<max; i++) {
> try {Thread.sleep(50);}
> catch (InterruptedException e) { }
> double dummy=Math.random()*4;
> if (dummy<1){
> x[i]= x[i-1]+step;
> y[i]= y[i-1];
> } else if (dummy<2){
> x[i]= x[i-1];
> y[i]= y[i-1]+step;
> } else if (dummy<3){
> x[i]= x[i-1]-step;
> y[i]= y[i-1];
> } else {
> x[i]= x[i-1];
> y[i]= y[i-1]-step;
> }
> vej.lineTo(x[i],y[i]);
> repaint();
> }// for-lykke slutter
> udvisk=true;

// Her mener du nok at der skal oprettes en ny "vej", så der ikke
fortsættes
// med den allerede tegnede:
vej = new GeneralPath();

> repaint();

// her skal du lægge mærke til at dette ikke nødvendigvis medfører
//et kald til paint() metoden umiddelbart - repaint() kan godt vente
lidt,
//og så vil "udvisk" være sat til "false". Prøv evt. at kalde paint
direkte:
paint( getGraphics() );
// (og så kan du også fjerne kaldet til "repaint()" ovenfor)

>
> } // while-lykke slutter
> }
>
> public void stop() {
> if (runner != null) {
> runner = null;

// jeg er ikke så vild med ovenstående betingelse, da den næsten
// med garanti ikke betyder noget performancemæssigt ("runner"
// variablen skal hentes både hvis betingelsen er opfyldt og ikke.
// - men det betyder selvfølgelig ikke noget for funktionaliteten..

> }
> }
> }

Jeg håber du kan bruge det til noget.

Ulrik Magnusson


Torben Svendsen (06-01-2003)
Kommentar
Fra : Torben Svendsen


Dato : 06-01-03 07:31

> // Her mener du nok at der skal oprettes en ny "vej", så der ikke
> fortsættes
> // med den allerede tegnede:
> vej = new GeneralPath();

Selvfølgelig - her ligger den afgørende fejl!

Tusind tak for denne og de øvrige kommentarer. Nu kører appletten som den
skal.

Med venlig hilsen
Torben Svendsen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408905
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste