Avatar billede netsrac Praktikant
02. december 2001 - 16:42 Der er 29 kommentarer og
1 løsning

Kaldender ?

Nu har jeg brugt en enorm mængde tid på at få lavet en visuel kalender i java til brug i et eksammensprojekt, det gik også fint, det hele virkede, men så pludselig opdager man at der er noget galt med uge nummerene i januar måned.

Så jeg skal bruge et link til en kalender i java eller en der måske kan finde fejlen i min ?
Avatar billede maxium Novice
02. december 2001 - 16:43 #1
Avatar billede netsrac Praktikant
02. december 2001 - 16:46 #2
Hvad skal jeg bruge det til ? Skal bruge en kalender i java ikke en julekalender!
Avatar billede erikjacobsen Ekspert
02. december 2001 - 16:56 #3
Lad os da finde fejlen - det er sjovt!
Avatar billede netsrac Praktikant
02. december 2001 - 17:00 #4
Erik >> Det ville være dejligt hvis det var muligt, koden ser sådan her ud:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.util.Calendar;
public class kalender implements ActionListener
{
    private JButton dage[] = new JButton[56];
    private Calendar c;
    private int y;
    private int m;
    private JButton btnTilbage, btnFrem;
    private JFrame fraMain = new JFrame(\"Kalender\");
   
    public kalender()
    {   
        c = Calendar.getInstance(new Locale(\"da\", \"DK\"));
        y = c.get(c.YEAR);
        m = c.get(c.MONTH);
       
        fraMain.setSize(235,210);
        fraMain.getContentPane().setLayout(new BorderLayout());
        fraMain.addWindowListener(new GenericWindowListener());
        fraMain.setResizable(false);
        drawKalender();
    }
   
    public void drawKalender()
    {
        fraMain.getContentPane().removeAll();
        for (int i = 0; i < dage.length; i++)
        {
            dage[i] = new JButton(\"\");
            dage[i].setEnabled(false);
            dage[i].setBorder(BorderFactory.createEmptyBorder());
        }
       
        String[] dagbetegn = new String[]
        { \"Uge\", \"Man\", \"Tir\", \"Ons\", \"Tor\", \"Fre\", \"Lør\", \"Søn\" };
        String[] maaned = new String[]
        { \"Januar\", \"Februar\", \"Marts\", \"April\", \"Maj\",\"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"December\" };
       
        int j = 0;
        for (int i = 0; i < dagbetegn.length; i++)
        {
            dage[j] = new JButton(dagbetegn[i] + \" \");
            dage[j].setForeground(new Color(0,0,255));
            dage[j].setBorder(BorderFactory.createEmptyBorder());
            dage[j++].setFont(new Font(\"Tahoma\", Font.PLAIN, 12));

        }

        int d = 0;
        c.set(y, m, d);
       
        j = 8;

        while (d <= 31)
        {
            dage[j] = new JButton(new Integer(c.get(c.WEEK_OF_YEAR)).toString());
            dage[j].setForeground(new Color(0,0,255));
            dage[j].setBorder(BorderFactory.createEmptyBorder());
            dage[j].setFont(new Font(\"Tahoma\", Font.PLAIN, 12));

            d = d + 7;
            j = j + 8;
            c.set(y, m, d);
        }

        j = 8 + c.get(c.DAY_OF_WEEK);
        int i = 1;
       
        d = 1;
       
        c.set(y, m, d);
               
        while (i <= 31)
        {
            if (c.get(c.MONTH) == m)
                dage[j] = new JButton(new Integer(i).toString());
                dage[j].setBorder(BorderFactory.createEmptyBorder());
                dage[j].addActionListener(this);
                dage[j++].setFont(new Font(\"Tahoma\", Font.PLAIN, 12));

            if (j % 8 == 0)
                j = j + 1;
            i++;
            d++;
            c.set(y, m, d);
        }
       
        JPanel panKalender = new JPanel();
        panKalender.setLayout(new GridLayout(7,8));
       
        for (i = 0; i < dage.length; i++)
            panKalender.add(dage[i]);

        JLabel labMaaned = new JLabel(maaned[m] + \" \" + y);
        labMaaned.setFont(new Font(\"Tahoma\", Font.PLAIN, 12));
        labMaaned.setForeground(new Color(0,0,255));
        labMaaned.setHorizontalAlignment(SwingConstants.CENTER);
        labMaaned.setHorizontalTextPosition(SwingConstants.CENTER);
       
        btnTilbage = new JButton(\"<<\");
        btnTilbage.setFont(new Font(\"Tahoma\", Font.PLAIN, 12));
        btnTilbage.setForeground(new Color(0,0,255));
        btnTilbage.setBorder(BorderFactory.createEmptyBorder());
        btnTilbage.addActionListener(this);
       
        btnFrem = new JButton(\">>\");
        btnFrem.setFont(new Font(\"Tahoma\", Font.PLAIN, 12));
        btnFrem.setForeground(new Color(0,0,255));
        btnFrem.setBorder(BorderFactory.createEmptyBorder());
        btnFrem.addActionListener(this);
       
        JPanel panKalenderTop = new JPanel();
        panKalenderTop.setLayout(new BorderLayout());
        panKalenderTop.add(btnTilbage, BorderLayout.WEST);
        panKalenderTop.add(labMaaned, BorderLayout.CENTER);
        panKalenderTop.add(btnFrem, BorderLayout.EAST);
       
       
        JPanel panTopLeft = new JPanel();
        panTopLeft.setLayout(new BorderLayout());
        panTopLeft.add(panKalenderTop, BorderLayout.CENTER);
        panTopLeft.add(panKalender, BorderLayout.SOUTH);
        panTopLeft.setBorder(BorderFactory.createTitledBorder(\"Kalender\"));           


        JPanel panLeft = new JPanel();
        panLeft.setLayout(new BorderLayout());
        panLeft.add(panTopLeft, BorderLayout.NORTH);

        fraMain.getContentPane().add(panLeft, BorderLayout.WEST);
        fraMain.show();
    }
   
    public void actionPerformed(ActionEvent event)
    {
        Object source = event.getSource();
        if (source == btnTilbage)
        {
            if (m == 0)
            {
                m = 11;
                y = y - 1;
            }
            else
            {
                m = m - 1;
            }
            drawKalender();
        }
        else if (source == btnFrem)
        {
            if (m == 11)
            {
                m = 0;
                y = y + 1;
            }
            else
            {
                m = m + 1;
            }
            drawKalender();           
        }
        else
        {
            for(int i = 0; i < dage.length; i++)
            {
                if (source == dage[i])
                {
                    //new Dag(dage[i].toString());
                    //new Dag(Integer.parseInt(dage[i].getText()), m, y);
                }
            }
        }
    }
}
Avatar billede erikjacobsen Ekspert
02. december 2001 - 17:12 #5
Bliver ugenummeret beregnet i denne linie?

          dage[j] = new JButton(new Integer(c.get(c.WEEK_OF_YEAR)).toString());

Så skal du passe på definitionen af ugenumre, som er forskellig i fx DK og USA.
I Danmark er uge 1 den uge, der har den første torsdag i januar - eller hvordan
det nu er formuleret. Hvad er din locale? Sæt den til dansk.
Avatar billede netsrac Praktikant
02. december 2001 - 17:16 #6
Ja det er den der henter ugenummeret, jeg har også sat locale til dansk med:

c = Calendar.getInstance(new Locale(\"da\", \"DK\"));

Men synes ikke rigtigt det har nogen effekt.
Avatar billede erikjacobsen Ekspert
02. december 2001 - 17:23 #7
Det gør du da også ... hvilke tal giver den i januar?
Avatar billede netsrac Praktikant
02. december 2001 - 17:27 #8
I Januar 2002 virker den fint og giver ugerne 1-5, men i Januar 2001 giver det ugerne 52,1,2,3,4 hvor det skulle have givet 1-5
Avatar billede erikjacobsen Ekspert
02. december 2001 - 17:42 #9
Har du check på hvad etFirstDayOfWeek() og getMinimalDaysInFirstWeek() er sat
til - de har vist ikke noget at gøre med locale?

http://java.sun.com/j2se/1.4/docs/api/java/util/Calendar.html#WEEK_OF_YEAR
Avatar billede netsrac Praktikant
02. december 2001 - 17:47 #10
getMinimalDaysInFirstWeek giver 4 og getFirstDayOfWeek giver 2 ?
Avatar billede erikjacobsen Ekspert
02. december 2001 - 18:13 #11
Ja, 4 svarer til det med torsdag, og 2 svarer til mandag, så det er jo ok...
øv, så skal vi til at tænke os om ....:)
Avatar billede erikjacobsen Ekspert
02. december 2001 - 18:22 #12
Du har et tilsvarende problem i sidste uge i marts 2002 og første uge i april 2002 :)

Det må have noget at gøre med den dag du aflæser som udgangspunkt.
Avatar billede erikjacobsen Ekspert
02. december 2001 - 18:25 #13
Du skal bare

                          c.set(y, m, 1);
Avatar billede erikjacobsen Ekspert
02. december 2001 - 18:26 #14
Og jeg beklager meget at bryde mine ellers yderst standhaftige principper om
ikke at blive involveret i spørgsmål til mere end 60 point. Jeg overså det ganske
enkelt. Der vil derfor ikke være nogen måde du kan give mig point på - og jeg
skal gøre mig umage for at denne fejltagelse ikke gentager sig
Avatar billede netsrac Praktikant
02. december 2001 - 18:29 #15
Hvor mener du jeg skal gøre det henne  ?
Avatar billede erikjacobsen Ekspert
02. december 2001 - 18:31 #16
Der hvor du skriver c.set(y,m,d), for d er nemlig 0.
Avatar billede netsrac Praktikant
02. december 2001 - 18:36 #17
Så for jeg mærkeligt nok 2 uge 14 i April 2002 ?

Med hensyn til point, kan du bare få de 60 så tager jeg selv de 20 igen :)
Avatar billede erikjacobsen Ekspert
02. december 2001 - 18:48 #18
Nå ja, der er 2 uge 14 - tror du der er nogen, der ser det :))
og også i okt og jan 2001 --- øv, det var ellers næsten korrekt.

Det er ikke et spørgsmål om jeg får 60 eller ej. Jeg deltager ganske
enkelt ikke i spørgsmål, der er stillet til mere end 60. Det er nu engang
mit valg - ik\' ?

Avatar billede netsrac Praktikant
02. december 2001 - 18:53 #19
Jo det er helt klart dit eget valg om hvilke spørgsmål du deltager i, men jeg er da glad for at du hjælper i dette spm.
Avatar billede erikjacobsen Ekspert
02. december 2001 - 19:16 #20
Nå, du har nu en sjov måde at kode på. Du kan sikkert se hvor dette skal
ændres, og så må du selv se om det kommer til at passe:

    int d =1;
    c.set(y, m, d);
                         
    j = 8;

    while (d <= 31)
    {
        dage[j] = new JButton(new Integer(c.get(c.WEEK_OF_YEAR)).toString());
        dage[j].setForeground(new Color(0,0,255));
        dage[j].setBorder(BorderFactory.createEmptyBorder());
        dage[j].setFont(new Font(\"Tahoma\", Font.PLAIN, 12));

        d = d + 7;
        j = j + 8;
        c.set(y, m, d);
    }
    c.set(y, m, 1);
    j = 8 + c.get(c.DAY_OF_WEEK)-1;
    int i = 1;
Avatar billede netsrac Praktikant
02. december 2001 - 19:26 #21
Hm, så går der bare desværre noget galt i juli 2001 her er der pludselig ikke noget ugenummer, det er da utroligt at det skal være så svært.
Avatar billede erikjacobsen Ekspert
02. december 2001 - 19:35 #22
ok - jeg kan se problemet i juli 2001...
Avatar billede erikjacobsen Ekspert
02. december 2001 - 19:48 #23
Skal vi tage en tur mere. Check lige igen April 2001


int d =1;
                            c.set(y, m, d);
                            j = 8;

                            while (d <= 31)
                            {
                                dage[j] = new JButton(new Integer(c.get(c.WEEK_OF_YEAR)).toString());
                                dage[j].setForeground(new Color(0,0,255));
                                dage[j].setBorder(BorderFactory.createEmptyBorder());
                                dage[j].setFont(new Font(\"Tahoma\", Font.PLAIN, 12));

                                d = d + 7;
                                j = j + 8;
                                c.set(y, m, d);
                            }
                    c.set(y, m, 0);

                            j = 8 + c.get(c.DAY_OF_WEEK);
                            int i = 1;
Avatar billede netsrac Praktikant
02. december 2001 - 19:55 #24
Så rykker den dage en frem, dage bliver forskudt en dag så 1 december i år bliver til en søndag.
Avatar billede erikjacobsen Ekspert
02. december 2001 - 19:59 #25
nej - skriv rigtigt af
Avatar billede netsrac Praktikant
02. december 2001 - 20:08 #26
yes, nu ser det ud til at virke, det er dælme dejligt, du skal have mange mange tak :)

Kunne det tænkes at du også kunne løse det lille problem som jeg har valgt at overse med at der mangler et ugenummer på den sidste uge når en måned har 6 uger som december i år ? :)
Avatar billede erikjacobsen Ekspert
02. december 2001 - 20:19 #27
                            int d =1;
                            c.set(y, m, d);
                            j = 8;

int erik=c.get(c.WEEK_OF_YEAR)-1;
                            while (d <= 31)
                            {
if (erik!=c.get(c.WEEK_OF_YEAR))
{

                                dage[j] = new JButton(new Integer(c.get(c.WEEK_OF_YEAR)).toString());
                                dage[j].setForeground(new Color(0,0,255));
                                dage[j].setBorder(BorderFactory.createEmptyBorder());
                                dage[j].setFont(new Font(\"Tahoma\", Font.PLAIN, 12));
                              j = j + 8;
erik=c.get(c.WEEK_OF_YEAR);
}
                                d = d + 1;
                                c.set(y, m, d);
                            }
                    c.set(y, m, 0);

                            j = 8 + c.get(c.DAY_OF_WEEK);
                            int i = 1;
                           
Avatar billede netsrac Praktikant
02. december 2001 - 20:41 #28
Du er jo en knag :) Takker for det, ville gerne give dig lidt point, men det vil du jo ikke tillade.

Du har ikke noget imod at jeg ændrer den variabel der hedder erik inden jeg går til eksammen vel ? :)
Avatar billede erikjacobsen Ekspert
02. december 2001 - 20:47 #29
Du må hellere kalde den erikjacobsen - mere rimeligt. Men gør hvad du vil.
Og næste gang du stiller spørgsmål til 80 p bliver det uden mig - ganske
uanset at dette var ret underholdende :)
Avatar billede netsrac Praktikant
02. december 2001 - 20:50 #30
Så må jeg jo hellere holde mig under 60 når jeg vil have din hjælp :) Du skal ihvertfald have tak :)
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