rulle tekst

Tags:    java

hej
jeg har lidt problemer med en rulle tekst, den flimre når den kører. hvordan stopper jeg dette flimer??
Koden:

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


public class simpel extends Applet implements Runnable{


int ypos = 200;
String text = "Hallo world";
Thread traad;

public void init() {


}


public void paint(Graphics g) {

g.drawString(text,20,ypos);

}


public void run(){

while(traad != null){
ypos--;
if(ypos == 0){
ypos = 200;
}

try{
Thread.sleep(25);
}catch(InterruptedException e){}
repaint();
}

}

public void start(){

if(traad == null){
traad = new Thread(this);
traad.start();
}

}

public void stop(){

if(traad != null){
traad.stop();
traad = null;
}

}


}




3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Hej

Grunden til din applet flimrer er at du ikke bruger double buffering! Hver gang du repainter din applet bliver update metoden kaldt, update metoden sletter hele din applet for herefter at kalde paint, det betyder som du sikkert selv har regnet ud, at du har et kort øjeblik hvor der ikke står noget på din applet. Måden at løse det på er at overskrive update metoden med din egen og sørge for den ikke sletter din applet inden den tegner den igen, dette kan gøres ved at have to "Graphics" en af dem er en baggrundsbuffer du tegner det næste billede på og herefter bytter rundt på "baggrundsbufferen" og "forgrundsbufferen", følgende kode kan illustrere dette:

private Image dbImage;
private Graphics dbg;

...

public void update(Graphics g) {
// initialize buffer
if (dbImage == null) {
dbImage = createImage(this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics();
}
dbg.setColor(getBackground());
dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
dbg.setColor(getForeground());
paint(dbg);
g.drawImage(dbImage, 0, 0, this);

}

Det første du skal gøre at tilføje to nye private attributter til din applet. Herefter kan du tilføje den kode der står ovenfor og køre det uden problemer, og flimmer. Håber det hjælperm jeg har ofte brugt denne kode og har ikke haft problemer med den.

/Brian

hej
jeg har lidt problemer med en rulle tekst, den flimre når den kører. hvordan stopper jeg dette flimer??
Koden:

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


public class simpel extends Applet implements Runnable{


int ypos = 200;
String text = "Hallo world";
Thread traad;

public void init() {


}


public void paint(Graphics g) {

g.drawString(text,20,ypos);

}


public void run(){

while(traad != null){
ypos--;
if(ypos == 0){
ypos = 200;
}

try{
Thread.sleep(25);
}catch(InterruptedException e){}
repaint();
}

}

public void start(){

if(traad == null){
traad = new Thread(this);
traad.start();
}

}

public void stop(){

if(traad != null){
traad.stop();
traad = null;
}

}


}





Hejsa,

indsæt denne metode i din kode .... det skulle gøre tricket ... bare husk at du selv skal slette den 'gamle' string .. evt. ved at tegne en firkant henover det hele med samme baggrund som du bruger ... se den fulde kode ....

// NY METODE
public void update(Graphics g)
{
paint(g);
}


Mvh
Karsten


hej
jeg har lidt problemer med en rulle tekst, den flimre når den kører. hvordan stopper jeg dette flimer??
Koden:

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


public class simpel extends Applet implements Runnable{


int ypos = 200;
String text = "Hallo world";
Thread traad;

public void init() {


}


public void paint(Graphics g) {

//slet den foregående string her ....
//g.clearRect(int x, int y, int width, int height) eller
//g.fillRect(int x, int y, int width, int height)
g.drawString(text,20,ypos);

}

// NY METODE
public void update(Graphics g)
{
paint(g);
}


public void run(){

while(traad != null){
ypos--;
if(ypos == 0){
ypos = 200;
}

try{
Thread.sleep(25);
}catch(InterruptedException e){}
repaint();
}

}

public void start(){

if(traad == null){
traad = new Thread(this);
traad.start();
}

}

public void stop(){

if(traad != null){
traad.stop();
traad = null;
}

}


}





Til denne simple operation er det ikke nødvendigt med double buffer... det er lidt over kill ... men selvfølgelig er det en mulighed. Hvis man starter som jeg skrev (med at overwrite update metoden) kan man derefter - hvis der opstår problemer - bruge double buffer.

Mvh
Karsten





t