Avatar billede birkis Nybegynder
23. april 2002 - 14:18 Der er 8 kommentarer og
3 løsninger

Ur i JFrame

Jeg har en JFrame hvori jeg gerne vi have et ur.
Hvordan gør jeg for at uret opdateres hvert sekund?

Og hvordan får jeg 24-timers ur?
Avatar billede birkis Nybegynder
23. april 2002 - 14:19 #1
øv...

vi = vil

:-)
Avatar billede codemon Nybegynder
23. april 2002 - 14:29 #2
Du kommer nok nemmest om ved at bruge noget andre har lavet.
fx installerer en lille bønne.

Men det lærer man jo ikke så meget programmering af.
Avatar billede codemon Nybegynder
23. april 2002 - 14:30 #3
Avatar billede birkis Nybegynder
23. april 2002 - 14:35 #4
Ja, jeg har tænkt lidt på IBM’s IClock, da vi har brugt den i skolen, men som du selv siger; det lærer jeg ikke så meget af...

Er det svært at programmere selv?
Avatar billede carstenknudsen Nybegynder
23. april 2002 - 17:04 #5
For at få tegnet uret hvert sekund (eller med et
andet interval imellem) kan du  bruge Timer og
TimerTask klasserne fra java.util pakken.
Selve tiden får du ud ved at oprette et Date
objekt: new Date() der indeholder al den information
du har brug for til et ur og lidt til. At tegne selve
uret i din JFrame er let hvis du er tilfreds med
simpel grafik. Bruge getGraphics til at få et Graphics2D
objekt som du kan tegen i, en cirkel og tre visere
med tre linier.
Avatar billede jkrag Nybegynder
23. april 2002 - 17:42 #6
Nu siger du at du gerne vil have et ur, og gerne vil lære java, og jeg kan derfor ikke dy mig for at poste følgende lille program fundet på:
http://www.gamedev.net/hosted/javaextreme/obfpoll.htm

Det er ikke nogen JFrame, da forfatteren mener at det ville overskride de tilladte 1024 bytes maxgrænse i konkurrencen at skulle importere javax.swing. Jeg har dog uden større besvær kunne finde et par småting i programmet der kunne skæres væk uden konsekvenser og derved skabe plads til ærklæringen :-) så her kunne også være en lille øvelse og en lidt bagvendt måde at lære lidt java.

Programmet skal selvfølgelig gemmes i en fil der hedder C.java.
(og, ja, det er meningen at det skal stå på en linie, omend ikke noget krav for at det virker.)

import java.awt.*;import java.util.*;public class C extends Frame{Date D=new Date();void T(Date d){D=d;repaint();}double P=Math.PI,A=P/2,a,c,U=.05;int W,H,m,R;double E(int a,int u){return(3*P/2+2*P*a/u)%(2*P);}void N(Graphics g,double q,double s){g.fillPolygon(new int[]{H(s,q),H(U,q+A),H(U,q+3*A)},new int[]{J(s,q),J(U,q+A),J(U,q+3*A)},3);}public void paint(Graphics g){Color C=SystemColor.control;g.setColor(C);g.fillRect(0,0,W=size().width,H=size().height);W-=52;H-=52;R=Math.min(W/2,H/2);g.translate(W/2+25,H/2+36);g.setColor(C.darker());for(m=0;m<12;++m){a=E(m,12);g.drawLine(H(.8),J(.8),H(.9),J(.9));}m=D.getMinutes();N(g,E(D.getHours()*60+m,720),.5);N(g,E(m,60),.8);N(g,E(D.getSeconds(),60),.9);}int H(double y){return(int)(R*y*Math.cos(a));}int H(double y,double q){a=q;return H(y);}int J(double y){return(int)(R*y*Math.sin(a));}int J(double y,double q){a=q;return J(y);}public static void main(String[]_)throws Exception{C c=new C();c.resize(200,200);c.show();for(;;){c.T(new Date());Thread.sleep(200);}}}
Avatar billede bumle90 Nybegynder
23. april 2002 - 19:03 #7
hvis der er nogle der kan overskue den kodelinie der på få minutter så synes jeg de skal have pointene :D
Avatar billede jkrag Nybegynder
24. april 2002 - 10:41 #8
OK, så prøver jeg.
Jeg har længe haft planer om selv at gå programmet igennem, så jeg tog lige tiden nu....
Prøv med nedenstående version - den skulle være noget nemmere at blive klog på.
JEg har bevidst undladt at ændre flowet i programmet for at det stadig passer til originalen,
selv om det er tydeligt at nogle af metoderne og deres interne funktion er en direkte følge
af ønsket om at gøre det så kort som muligt. Så vidt jeg husker er det eneste jeg har flyttet
et par variabel deklareringer, og så har jeg lavet to seperate variable et sted hvor en variable (m) blev genbrugt.

Værsgo:


import java.awt.*;
import java.util.Date;

public class Clock extends Frame
{
    Date date = new Date();

    private void updateClock(Date date)
    {
        this.date = date;
        repaint();
    }

    static double PI = Math.PI;
    static double U = .05;
    double angle, c;
    int wide,high,radius;

    double calcAngle(int currentValue, int maxValue)
    {
        return (3 * PI / 2 + 2 * PI * currentValue / maxValue) % (2 * PI);
    }

    void drawArm(Graphics g, double ang, double s)
    {
        double A = PI / 2;
        int[] xPoints = new int[] {
                getXforAngle(s, ang),
                getXforAngle(U, ang + A),
                getXforAngle(U, ang + 3 * A)
        };
        int[] yPoints = new int[] {
                getYforAngle(s, ang),
                getYforAngle(U, ang + A),
                getYforAngle(U, ang + 3 * A)
        };
        int nPoints = 3;
        g.fillPolygon(xPoints, yPoints, nPoints);
    }

    public void paint(Graphics g)
    {
        Color C = SystemColor.control;
        g.setColor(C);
        g.fillRect(0, 0, wide = size().width, high = size().height);
        wide -= 52;
        high -= 52;
        radius = Math.min(wide / 2, high / 2);
        g.translate(wide / 2 + 25, high / 2 + 36);
        g.setColor(C.darker());


        //draw tickmarks
        for (int hour = 0; hour < 12; ++hour)
        {
            angle = calcAngle(hour, 12);
            g.drawLine(getXforCurrentAngle(.8), getYforCurrentAngle(.8), getXforCurrentAngle(.9), getYforCurrentAngle(.9));
        }
        int minutes = date.getMinutes();
        drawArm(g, calcAngle(date.getHours() * 60 + minutes, 720), .5);
        drawArm(g, calcAngle(minutes, 60), .8);
        drawArm(g, calcAngle(date.getSeconds(), 60), .9);
    }

    int getXforCurrentAngle(double relativeLength)
    {
        return (int) (radius * relativeLength * Math.cos(angle));
    }

    int getXforAngle(double relativeLength, double newAngle)
    {
        angle = newAngle;
        return getXforCurrentAngle(relativeLength);
    }

    int getYforCurrentAngle(double relativeLength)
    {
        return (int) (radius * relativeLength * Math.sin(angle));
    }

    int getYforAngle(double relativeLength, double newAngle)
    {
        angle = newAngle;
        return getYforCurrentAngle(relativeLength);
    }

    public static void main(String[] args)
    {
        Clock clock = new Clock();
        clock.resize(200, 200);
        clock.show();
        for (; ;)
        {
            clock.updateClock(new Date());
            try
            {
                Thread.sleep(200);
            }
            catch (InterruptedException e)
            {
            }
        }
    }
}



P.S: I forhold til den oprindelige forfatters kommentar om at han ikke kunne klemme
en JFrame udgave ind under grænsen, kan det nævnes at f.eks. variabeltildelingen til date
i erklæringen er overflødig, så her kan der da spares de nødvendige bytes.
Avatar billede birkis Nybegynder
28. april 2002 - 19:46 #9
Tak for al hjælp hidtil...

Jeg kigger på forslagene så snart jeg har tid, og vender så tilbage.
Avatar billede birkis Nybegynder
13. maj 2002 - 00:01 #10
Vel, jeg har nu haft tid til at kigge på det.

jkrag >> Garanteret et flot stykke kode, men man skal jo helst forstå hvordan det hænger sammen, ikke?  Jeg har hellere ikke tid til at finde ud af det... :-)

Jeg har derfor (lidt på tværs af hvad jeg sagde i starten) bestemt mig for bare at bruge IBMs IClock.

Så er jeg villig til at "kaste" nogle flere points på, til den der kan fortælle hvordan jeg gør for at opdatere datoen (som sidder ved uret på en JFrame) når klokken går over midnat.
Avatar billede birkis Nybegynder
04. juni 2002 - 01:14 #11
Nåh, ok...  Jeg opretter hellere et nyt spm. senere.  (Jeg har uanset ikke tid til at kigge på det nu.)

Tak for hjælpen alle.
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