Är det nån som vet hur man kan pausa ett Java program i tex 1 sekund?
Har försökt med Delay, men det vill inte funka.
Tack.
Delay i Java-program??
7 svar · 896 visningar · startad av fisken02
Hej!
För att på ett korrekt sätt skapa små delay's i Java så använder du dig utav klassen Thread eller interface:t Runnable.
Om du kikar i java api specification ( http://java.sun.com/j2se/1.4.1/docs/api/ )
på klassen Thread så ser du att den har bl a följande metod:
sleep(long millis)
den metoden kan du använda för att få ditt program att stanna upp i x antal millisekunder;
1000 ms = 1 sekund ;)
Idén med Threads(på svenska: trådar) är att du kan dela upp programmet i x antal trådar och låta varje tråd köras separerat. På detta vis så kan du tillsynes få en massa händelser att hända samtidigt.
T ex om du har en server så kan du ha en massa olika trådar som behandlar varje ny klient.
Om du inte körde med en trådad serverr så skulle klient 2 få snällt vänta på att klient 1 blir klar osv osv.
Med trådar så får varje tråd en viss tid att "göra saker", sedan innan turen går till nästa tråd osv osv.
Eftersom systemet växlar mellan varje tråd med några millisekunders mellanrum så ser det ut som om alla trådar körs samtidigt.
Om jag vet rätt så är det operativsystemet som växlar, inte Java Runtiem Environment. Därför så är det svårt att exakt veta i vilken turordning trådarna körs.
...
...
Om du ska låta din klass ärva(extends) Threads eller om du implementerar Runnable beror lite på hur din klass är uppbyggd(t ex om den redan ärver en annan klass osv) men båda alternativen fungerar.
om du ärver Thread:
varje Thread klass innehåller metoden start() och run();
start() metoden kallar på metoden run();
När du ärver Threads så skapar du en egen version av run(), eftersom den i klassen Threads är tom(antar jag). Detta kallas för funktionsöverlagring(method overloading).
dvs det som du vill att skall hända när din tråd startas, skall placeras i metoden run().
Exempel:
en simple Thread klass vars run() metod skriver ut "Hej!" med en sekunds paus i oändlighet:
public void run()
{
for(;;) // oändlig loop
{
Thread.sleep(1000); // tråden sover i en sekund
System.out.println("Hej!");
}
}
för att detta skall fungera så måste du placera for loopen inuti en try-catch sats eftersom metoden sleep kan kasta en InterruptedException.
Allt du behöver göra nu är att skapa en egen klass som ärver av Thread samt kallar på metoden run().
För att få snygga avslut på en tråd brukar man sätta en boolean för att hålla tråden igång så länge man vill och avsluta när man är nöjd.
private boolean cont;
public void run() {
cont = true;
while(cont) {
try {
//processa...
if(/*Nåt är inte helt ok eller saken är biff*/) {
cont = false;
}
} catch(Exception e) {
//Nåt gick käpprätt åt h-e
cont = false;
}
}
}
mvh
phonk
Hm, det vill sig inte riktigt. Kan man inte skicka med några variabler till run-metoden? Jag vill få en JToggleButton att vara nedtryckt i ungefär 0,5-1 sekund, för att sedan släppas upp igen. jag har 100 olika knappar som ligger på en GridLayout, med olika x och y-koordinater, och jag vill kunna trycka ner vilken som helst.
Problemet är att det kan vara olika många knappar från gång till gång, så jag måste skicka med x och y variablerna till metoden som skall trycka ner knappen.
Så här har jag försökt göra:
if(y+2<yHeight) {
if(x+2<xWidth){
if(!button[x+2][y+2].isSelected()){
button[x+2][y+2].setSelected(true);
//Häremellan vill jag ha en fördröjning på0,5-1 sek.
button[x+2][y+2].setSelected(false);
}
}
}
Försökte göra en Thread, men den vill inte köpa att man skickar med x och y till run();
Jaha, men gör bara så här:
if(y+2<yHeight) {
if(x+2<xWidth){
if(!button[x+2][y+2].isSelected()){
button[x+2][y+2].setSelected(true);
//Häremellan vill jag ha en fördröjning på0,5-1 sek.
try{
Thread.sleep(1000);
} catch(InterruptedException ie) { }
button[x+2][y+2].setSelected(false);
}
}
}
Inte skitsnyggt men hej, de funkar c",)
mvh
phonk
Jag testade det, men då stannar hela programmet, dvs man kan inte göra nånting annat under tiden. Jag vill bara att knappen skall sänkas och höjas igen, utan att det märks nåt avbrott i resten av programmet.
Nej det är ju inge bra, men pröva detta;
Stoppa in denna klass inuti din klass
private class ButtonLowerer implements Runnable {
private AbstractButton button;
private long hold;
private Thread t;
public ButtonLowerer(AbstractButton button,long hold) {
this.button = button;
this.hold = hold;
t = new Thread(this);
t.start();
}
public void run() {
try {
button.setSelected(true);
t.sleep(hold);
button.setSelected(false);
}
catch(Exception e) { }
}
}
Åsså gör du så här sen;
if(y+2<yHeight) {
if(x+2<xWidth){
if(!button[x+2][y+2].isSelected()){
//Häremellan vill jag ha en fördröjning på0,5-1 sek.
new ButtonLowerer(button[x+2][y+2],1000L);
}
}
}
mvh
phonk
JA!
Kanon. Tack så jättemycket för hjälpen!