Avatar billede swaq Nybegynder
08. januar 2003 - 23:10 Der er 3 kommentarer og
1 løsning

Identificerer en kaldende klasse i en metode i en anden klasse

Endnu en forvirrende overskrift fra mit skrivebord, but here's the deal:

I mit program er jeg interesseret i at anvende java.util.Timer, hvilket er lykkedes i en klasse således:
(jeg laver en nested klasse RemindTask)

public void actionPerformed(ActionEvent e){
    int delay = 3000;
    jLabelBesked.setText("Ikke fundet");
    timer.schedule(new RemindTask(),delay);
}
class RemindTask extends java.util.TimerTask {
    public void run() {
      jLabelBesked.setText("");
      timer.cancel(); //Terminate the timer thread
    }
}
Dette er ikke noget problem, da det hele foregår i samme klasse.

Mit problem er, at jeg ønsker at anvende denne timer funktionalitet i andre klasser ved at lave en statisk metode en klassen Tools.
Er det da muligt at lave en generel timer funktion, som er i stand til at udføre handlinger i den kaldende klasse??? Eksempelvis udføre setText(...) på en JLabel i den kaldende klasse?

Jeg har en idé om at det kan lade sig gøre på to måder
1: Hvis bare jeg er i stand til at identificere navnet på den klasse som kalder funktionen "run()" i Tools, vil jeg via if-sætninger kunne bestemme en given handling i den kaldende klasse (såfremt det altså er muligt at lave en setText(...) på en anden klasses JLabels)
2: Hvis run kunne alarmere/signalere den kaldende klasse når tiden var gået, så kan denne reagerer på dette signal.

Ideen med det hele er, at vise noget tekst (eksempelvis en fejlmeddelelse) for brugeren i 3 sekunder, hvorefter tekst fjernes igen ved at; setText(""), denne funktionalitet med en tidsforsinkelse vil jeg som sagt gerne gøre generel for hele programmet.

Jeg er ikke interesseret i at bruge Thread.sleep(3000), da denne fryser hele programmet (som jo kun kører en tråd).


Håber mit spørgsmål gav mening og er til at svare på!


På forhånd tak


/Swaq
Avatar billede disky Nybegynder
08. januar 2003 - 23:36 #1
Ja hvis du overfører dit object som der skal gøres noget på sammen med dit timerkald.

F.eks. en reference til dit JLabel object.
Avatar billede arne_v Ekspert
09. januar 2003 - 07:03 #2
Prøv med:

public interface RemindCallback {
    public void executeReminder();
}

public class RemindTask extends java.util.TimerTask {
    private RemindCallback rcb = null;
    public RemindTask(RemindCallback rcb) {
        this.rcb = rcb;
    }
    public void run() {
        rcb.executeReminder();
        timer.cancel();
    }
}

public class X implements RemindCallback {
    public void actionPerformed(ActionEvent e){
        int delay = 3000;
        jLabelBesked.setText("Ikke fundet");
        timer.schedule(new RemindTask(this),delay);
    }
    public void executeReminder() {
        jLabelBesked.setText("");
    }
}

Det er den rigtige OO måde at gøre det på.
Avatar billede swaq Nybegynder
09. januar 2003 - 14:11 #3
Super Arne, endnu engang har du på sublim måde reddet mit skind :O)
Mange tak!
Sorry disky, dit svar blev disket... *S*
Avatar billede swaq Nybegynder
09. januar 2003 - 14:28 #4
Koden skal dog se således ud i ReminderTask for at virke...
public class RemindTask extends java.util.TimerTask {

    private Reminder reminder = null;
    //timer skal defineres, da TimerTask er abstract
    private java.util.Timer timer = new java.util.Timer();

    public RemindTask(Reminder reminder) {
        this.reminder = reminder;
    }
    public void run() {
        reminder.executeReminder();
        timer.cancel();
    }
}
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