Avatar billede billeschou Nybegynder
17. oktober 2000 - 16:31 Der er 10 kommentarer og
1 løsning

ur i applikation

Jeg har lavet en applikation som blandt andet løbende skal vise det nuværende klokkeslæt. Jeg har oprettet en JLabel som viser klokkeslættet og dato. Hvordan kan jeg lave en konstant opdatering af indholdet af denne JLabel, så den ikke kun viser tid/dato på afviklingstidspunktet?
Avatar billede el_gnu Nybegynder
17. oktober 2000 - 16:46 #1
Du kunne bruge en Timer, hvilket er noget nemmere end at implementere Runnable.

Eks:

import javax.swing.*;

public class labelUr implements ActionListener {

JLabel jl = new JLabel();
Timer t = new Timer(1000, this);

public static void main(String args[]) {
  // skriv noget her
  t.start();
}

public void actionPerformed(ActionEvent e) {
// her skriver du koden der ændrer jl\'s tekst
}

}


Her bliver actionperformed kaldt en gang i sekundet
Avatar billede billeschou Nybegynder
17. oktober 2000 - 17:07 #2
Jeg er ikke klar over hvad du mener med \"skriv noget her\"... mangler der ikke også en linie a la
jl.addActionListener(new ActionListener()
i din kode?

Min kode ser foreløbig sådan ud:
<snip>
Date date = new Date();
SimpleDateFormat sdf =
new SimpleDateFormat(\"dd-MM-yy HH:mm:ss\");
//currentDateTimeLabel.setText(System.out.println(sdf.format(date)));
currentDateTimeLabel.setBounds(10,10,120,30);
String myString = sdf.format(date);
currentDateTimeLabel.setText(myString);
currentDateTimeLabel.setHorizontalAlignment(JLabel.LEFT);
<snip>
Avatar billede el_gnu Nybegynder
17. oktober 2000 - 19:37 #3
Det er timeren der skal bruge en ActionListener og den er det andet argument i constructoren:

Timer t = new Timer(1000, this);

this refererer til den aktuelle klasse hvor vi jo har implementeret ActionListener.

Her har jeg lavet et eksempel på en JFrame med en JLabel der viser tiden (utestet):


import javax.swing.*;
import javax.swing.event.*;

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

import java.util.*;

public class urLabel extends JFrame implements ActionListener{

    GregorianCalendar gc = new GregorianCalendar();
    JLabel jl;
    Timer t = new Timer(1000, this);

    public urLabel() {
        super(\"ur label test\");
        setSize(400,400);
        this.jl = new JLabel(nu());
        getContentPane().add(this.jl);
        WindowListener wndLuk = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        addWindowListener(wndLuk);
        show();
    }

    private String nu() {
        gc = new GregorianCalendar();
        return gc.get(Calendar.HOUR_OF_DAY)+\":\"+gc.get(Calendar.MINUTE)+\":\"+gc.get(Calendar.SECOND);
    }

    public static void main(String[] args) {
        new urLabel();
    }

    public void actionPerformed(ActionEvent e) {
        this.jl.setText(nu());
    }
}


Avatar billede billeschou Nybegynder
18. oktober 2000 - 11:35 #4
smart! :)

Jeg fandt selv på en løsning, som jeg ikke helt kan gennemskue om er ressourcekrævende eller ej.

Jeg gjorde simpelthen det at jeg placerede alle de elementer jeg havde brug for på skærmbilledet.
Derefter lavede jeg så en simpel for-løkke:

for (int x=0;;x++)
{
date = new Date();
labeltekst.setText(sdf.Format(date));
}

sdf er her en variabel af typen SimpleDateFormat

Hvad jeg ikke er helt sikker på er, om det objekt der bliver oprettet via Date(); nedlægges efter hvert gennemløb af løkken eller om de gamle objekter stadig flyder rundt et eller andet sted derude...

Såvidt jeg kan forstå, så kører java sin garbage collector med jævne mellemrum uden at man skal bede den om det. Hvis det er rigtigt, er der jo intet problem med min metode, men jeg vil være helt sikker på at jeg ikke bruger mere og mere hukommelse ved hvert gennemløb
Avatar billede el_gnu Nybegynder
18. oktober 2000 - 11:42 #5
hmm, det er ikke smart at køre en for løkke(nemmere med while true) hele tiden. Du optager simpelthen alt for mange resourcer. Det er derfor man har Timer og Runnable
Avatar billede billeschou Nybegynder
18. oktober 2000 - 11:56 #6
ok, det var jo det jeg havde på fornemmelsen - selv om det nok først vil kunne mærkes efter at have programmet har kørt i LANG tid(!?)... kunne man forresten ikke bruge TextListener i stedet for ActionListener?
Avatar billede el_gnu Nybegynder
18. oktober 2000 - 12:15 #7
TextListener?
Avatar billede el_gnu Nybegynder
18. oktober 2000 - 17:31 #9
ahhh, men det har ikke noget med det her at gøre!
TextListener er hvis du vil gøre noget hver gang en tekst bliver ændret, men her vil du \"lytte\" efter de ActionEvents som Timeren laver.
Avatar billede billeschou Nybegynder
19. oktober 2000 - 10:57 #10
hmmm... jeg kunne ikke helt få det til at virke. Kunne jeg få dig til at kigge på det, hvis jeg sender dig koden?
Avatar billede el_gnu Nybegynder
19. oktober 2000 - 11:56 #11
jep, eksperten@espen.dk
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