Innholdsoversikt for programutvikling
Calendar
-klassenFor programmering av dato og tid, har vi i
klassebibliotekets pakke java.util
klassene
Date
,
Calendar
og dens subklasse
GregorianCalendar
. Et
Date
-objekt
representerer et
bestemt tidspunkt i tiden, med en presisjon på millisekund nær.
(Internt i klassen er tidspunktet bestemt som et antall
millisekunder fra 1. januar 1970.)
Opprinnelig hadde denne klassen også to tilleggsfunksjoner.
Den tillot tolking av datoer i form av år, måned, dag, time, minutt og sekund.
Den tillot også formatering og parsing av datostrenger.
Metodene for dette var imidlertid ikke laget slik at det kunne tas hensyn til
forskjellige tidssoner og lokale standarder for formatering.
Derfor er Date
-klassens funksjonalitet for dette nå markert som
foreldet.
Isteden skal
Calendar
-klassen
brukes til
tolking av datoer i form av år, måned, dag, time, minutt og sekund.
Til formatering og parsing av datostrenger skal
DateFormat
-klassen brukes.
Calendar
-klassen er en abstrakt basisklasse for
konvertering mellom et Date
-objekt (som den inneholder) og et
sett av int
-datafelter slik som YEAR, MONTH, DAY, HOUR,
etc. Subklasser av Calendar
tolker et Date
-objekt
i samsvar med reglene i et bestemt kalendersystem. Foreløpig finnes subklassen
GregorianCalendar
som representerer vår vanlige kalender.
Tilsvarende som for andre klasser der innholdet skal tilpasses lokale forhold,
finnes det i Calendar
-klassen en static
-metode
getInstance
for å få opprettet og returnert et standardobjekt av
vedkommende type. Calendar
-klassens metode getInstance
returnerer et objekt av type GregorianCalendar
som er initialisert
til det tidspunkt da det ble opprettet:
Calendar nå = Calendar.getInstance();
Vi kan bruke set
-metoder for å sette verdi for bestemte
datafelter.
nå.set( Calendar.HOUR_OF_DAY, 15 );
For å hente ut verdier fra datafelter kan vi bruke get
-metoder.
int måned = nå.get( Calendar.MONTH ) + 1;
NB! Calendar.MONTH
starter på 0.
For å øke eller minke et datafelt, kan vi bruke add
-metoden.
nå.add( Calendar.DAY_OF_MONTH, 5 );
For å minke, øker vi med en negativ verdi. OBS! Eventuell nødvendig
økning (eller minking) av Calendar.MONTH
vil skje automatisk når
dagen endres. Tilsvarende gjelder for alle andre felt.
Det er også mulig å sette verdien for flere felt samtidig.
nå.set( år, måned, dag ); nå.set( år, måned, dag, time, minutt );
Parametrene vil bli tolket i den rekkefølge som her er antydet ved navnebruken.
Vi kan også hente ut det Date
-objekt som
Calendar
-objektet inneholder. Og vi kan sette verdi for dette.
Date tid = nå.getTime(); Calendar ny = Calendar.getInstance(); ny.setTime( tid );
Objekter av type GregorianCalendar
kan vi også opprette på
vanlig måte ved bruk av new
-operatoren. Bruker vi
default-konstruktøren, vil objektet bli initialisert til det tidspunkt det
ble opprettet. Men det finnes også konstruktører med parametre for
initialisering av dato (år, måned, dag), og for dato og tidspunkt
(år, månded, dag, time, minutt), eventuelt med tilleggsparameter for sekund.
Vi skal ta for oss et program som viser en månedskalender for den aktuelle måned når programmet blir kjørt. Følgende bilde viser et eksempel. Dagens dato blir vist med uthevet skrift.
Programmet er tilpasset etter et eksempel i boka Core Java av Cay S. Horstmann og Gary Cornell. Det er tilpasset norske forhold. Dessuten blir kalenderen vist på et panel istedenfor på en utskrift i konsollvinduet. Det blir også laget overskrift med månedsnavn og årstall.
Panelet med kalenderen er definert av klassen
Maanedskalender
som er gjengitt nedenfor. I paintComponent
-metoden, som blir kalt opp
automatisk hver gang det er behov for å friske opp programvinduet på skjermen, blir
tidspunktet oppdatert til det øyeblikk metoden blir utført, slik at vi sikrer oss at
kalenderen viser dagens dato riktig. Programmet er skrevet slik at det virker riktig
på den lokalitet der det blir installert. Her i Norge får vi riktige navn på dagene
og månedene, og som første ukedag får vi mandag. (I USA er det søndag.)
Panelet som viser kalenderen kan legges inn i et hvilket som helst vindu.
Testprogrammet
Maanedskalendertest
er et lite testprogram som bare viser et slikt panel.
1 import javax.swing.*; 2 import java.util.Calendar; 3 import java.util.GregorianCalendar; 4 import java.util.Date; 5 import java.text.DateFormatSymbols; 6 import java.awt.*; 7 8 public class Maanedskalender extends JPanel 9 { 10 private GregorianCalendar kalender; 11 private int iDag; 12 private int måned; 13 private int førsteUkedag; 14 private String[] ukedagnavn; 15 private String[] månedsnavn; 16 private int mellomrom = 30; 17 private int linjeavstand = 20; 18 private int xStart = 20, yStart = 30; 19 private Font skrivefont = new Font("SansSerif", Font.PLAIN, 16); 20 private Font iDagfont = new Font("SansSerif", Font.BOLD, 16); 21 22 public Maanedskalender() 23 { 24 setPreferredSize(new Dimension(250, 190)); 25 kalender = new GregorianCalendar(); 26 iDag = kalender.get(Calendar.DAY_OF_MONTH); 27 måned = kalender.get(Calendar.MONTH); 28 //får tak i hvilken dag uka starter med (mandag i Europa) 29 førsteUkedag = kalender.getFirstDayOfWeek(); 30 ukedagnavn = new DateFormatSymbols().getShortWeekdays(); 31 månedsnavn = new DateFormatSymbols().getMonths(); 32 } 33 34 public void paintComponent(Graphics g) 35 { 36 super.paintComponent(g); 37 //Oppdaterer kalenderen til dagens dato: 38 Date nå = new Date(); 39 kalender.setTime(nå); 40 //Skal finne innrykket fram til første dato i måneden. 41 //Setter kalenderen til første dag i måneden: 42 kalender.set(Calendar.DAY_OF_MONTH, 1); 43 int ukedag = kalender.get(Calendar.DAY_OF_WEEK); 44 //Finner innrykk for første linje: 45 int innrykk = 0; 46 while (ukedag != førsteUkedag) 47 { 48 innrykk++; 49 kalender.add(Calendar.DAY_OF_MONTH, -1); 50 ukedag = kalender.get(Calendar.DAY_OF_WEEK); 51 } 52 //Nå er ukedag == førsteUkedag 53 //Skal lage overskrift med måned, år og liste over ukedagene. 54 g.setFont(iDagfont); 55 int x = xStart, y = yStart; 56 String navn = månedsnavn[måned]; 57 navn = navn.replace(navn.charAt(0), 58 Character.toUpperCase(navn.charAt(0))); 59 navn = navn + " " + kalender.get(Calendar.YEAR); 60 g.drawString(navn, x, y); //skriver ut månedsnavn og årstall 61 y += linjeavstand; 62 //skriver ut en linje med dagenes navn 63 do 64 { 65 g.drawString(ukedagnavn[ukedag], x, y); 66 x += mellomrom; 67 kalender.add(Calendar.DAY_OF_MONTH, 1); 68 ukedag = kalender.get(Calendar.DAY_OF_WEEK); 69 } while (ukedag != førsteUkedag); 70 71 //Skal liste ut alle månedens datoer, riktig plassert 72 //under ukedagene. 73 g.setFont(skrivefont); 74 x = xStart + innrykk * mellomrom; 75 y += linjeavstand; 76 kalender.set(Calendar.DAY_OF_MONTH, 1); 77 do 78 { 79 int dag = kalender.get(Calendar.DAY_OF_MONTH); 80 ukedag = kalender.get(Calendar.DAY_OF_WEEK); 81 String utskrift; 82 if (dag < 10) 83 { 84 utskrift = " " + dag; 85 } 86 else 87 { 88 utskrift = "" + dag; 89 } 90 if (ukedag == Calendar.SUNDAY) 91 { 92 g.setColor(Color.red); 93 } 94 if (dag != iDag) 95 { 96 g.drawString(utskrift, x, y); 97 } 98 else 99 { 100 g.setFont(iDagfont); 101 g.drawString(utskrift, x, y); 102 g.setFont(skrivefont); 103 } 104 g.setColor(Color.black); 105 x += mellomrom; 106 //går til neste dag 107 kalender.add(Calendar.DAY_OF_MONTH, 1); 108 ukedag = kalender.get(Calendar.DAY_OF_WEEK); 109 110 //starter på ny linje i tilfelle ukestart 111 if (ukedag == førsteUkedag) 112 { 113 x = xStart; 114 y += linjeavstand; 115 } 116 } while (kalender.get(Calendar.MONTH) == måned); 117 } 118 }
Når vi har å gjøre med flere forskjellige tidspunkter, kan vi dels være interessert i rekkefølgen for dem reint kronologisk - om et tidspunkt er tidligere enn et annnet tidspunkt. Dels kan vi være interessert i avstanden mellom dem i for eksempel antall dager, timer eller minutter. For å finne ut av dette, har vi flere muligheter.
Date
-objekterFor å sjekke om Date
-objektet nå
representerer
et tidligere tidspunkt enn Date
-objektet da
, kan vi
bruke Date
-metoden before
:
if ( nå.before( da ) ) ... // det er tilfelle at nå er tidligere enn da else ... // nå er samtidig med eller seinere enn da
Det finnes en tilsvarende Date
-metode after
.
Date
-klassen implementer
interface Comparable<Date>
.
For Date
-objekter er det derfor definert en compareTo
-metode.
Den er implementert til å gi kronologisk rekkefølge. Dersom vi for de to
Date
-objektene nå
og da
skriver instruksjonen
nå.compareTo( da )
så vil vi få returnert en negativ int
-verdi i tilfelle nå
er tidligere enn da
, 0
i tilfelle de to tidspunktene er eksakt lik
hverandre, og en positiv int
-verdi i tilfelle nå
er
et seinere tidspunkt enn da
.
Calendar
-objekterFor å finne ut av rekkefølgen for to Calendar
-objekter
nå
og da
har vi flere muligheter. Dersom det bare
er rekkkefølgen vi vil sjekke, kan vi skrive slik
if ( nå.after( da ) )
...
eller
if ( nå.before( da ) )
...
Calendar
-klassen implementerer
interface Comparable<Calendar>
med en compareTo
-metode som
også gir kronologisk rekkefølge. Vi kan derfor bruke compareTo
-metode
for Calendar
-objekter på samme måte som det ovenfor er beskrevet
for Date
-objekter.
Dersom vi er interessert i å finne tidsforskjellen mellom to tidspunkter,
kommer det litt an på hvor stor nøyaktighet vi behøver, og om de to
tidspunktene er innenfor samme år eller ikke. Avstand i antall dager mellom to
Calendar
-objekter nå
og da
innenfor
samme år kan vi finne slik:
int dagerIAvstand = Math.abs( nå.get( Calendar.DAY_OF_YEAR ) -
da.get( Calendar.DAY_OF_YEAR ) );
Dersom vi ønsker større presisjon, eller de to tidspunktene ikke er
innenfor samme år, er det enklest først å finne avstanden i antall millisekunder
og så gjøre denne om til antall dager, timer, og eventuelt minutter, sekunder
og millisekunder. For avstand mellom de to Calendar
-objektene
nå
og da
blir det slik:
long avstand = Math.abs( nå.getTime().getTime() - da.getTime().getTime() ); long enDag = 24 * 60 * 60 * 1000; long antDager = avstand / enDag; long avstand = avstand % enDag; // rest til fordeling på timer og minutter long enTime = 60 * 60 * 1000; long antTimer = avstand / enTime; // eventuell fortsettelse for også å finne minutter, sekunder og millisek.
Klassen
DateFormat
i pakken java.text
har som
oppgave å gi formatering ved utskrift av datoer og tidspunkter.
Klassen har flere forskjellige verktøymetoder som returnerer et
DateFormat
-objekt som gir forskjellig format ved utskrift.
Ved å skrive
DateFormat df = DateFormat.getInstance();
får vi returnert et DateFormat
-objekt som gir
standardformatering ved bruk av dets format
-metode, slik som
02.03.12 13:57
på det tidspunkt dette skrives. Som parameter i format
-metoden
må vi bruke et Date
-objekt som representerer vedkommende tidspunkt.
Skriver vi
DateFormat di = DateFormat.getDateInstance();
får vi returnert et DateFormat
-objekt som ved bruk av dets
format
-metode gir formatering som 02.mar.2012.
Skriver vi
DateFormat ti = DateFormat.getTimeInstance();
får vi returnert et DateFormat
-objekt som ved bruk av dets
format
-metode gir formatering som 14:17:48, altså bare klokkeslett.
Skriver vi
DateFormat dti = DateFormat.getDateTimeInstance();
får vi returnert et DateFormat
-objekt som ved bruk av dets
format
-metode gir formatering som 02.mar.2012 14:18:53.
Ved kall på denne metoden kan vi også legge inn aktuelle parametre som
spesifiserer hvordan vi ønsker at dato og klokkeslett skal vises. Skriver vi
for eksempel
DateFormat klokkeformat = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.MEDIUM );
så vil bruk av format
-metoden gi en formatering som
2. mars 2012 14:20:39. (Første parameter bestemmer format for datoen,
andre parameter bestemmer format for klokkeslettet.)
Ønsker vi selv å definere formateringen, kan vi opprette et objekt av
type
SimpleDateFormat
med en formateringsstreng som
konstruktørparameter. (Denne klassen er en konkret subklasse til den
abstrakte klassen DateFormat
.)
Skriver vi for eksempel
SimpleDateFormat sf = new SimpleDateFormat( "dd.MM.yy" );
får vi ved bruk av objektets format
-metode en formatering
som 02.03.12. Det finnes også andre muligheter.
Et DateFormat
-objekt har også en parse
-metode
som konverterer en datostreng (mottatt som parameter) til et
Date
-objekt og returnerer dette.
Formateringsobjektene som er omtalt ovenfor skal normalt bli initialisert til å bruke de formatene som gjelder på den lokaliteten der java er installert, det vil si etter norsk standard for vårt vedkommende. For å sikre å få formatering etter den standard vi ønsker, kan vi supplere konstruktørene med en ekstra parameter for den lokaliteten som det skal brukes standard for. Dersom vi vil sikre oss å få formatering etter norsk standard, kan vi opprette de formateringsobjektene som er brukt i eksemplene ovenfor på denne måten:
java.util.Locale norge = new java.util.Locale( "no" ); //lokalitetsobjekt for norsk standard DateFormat df = DateFormat.getInstance( DateFormat.SHORT, DateFormat.SHORT, norge ); DateFormat di = DateFormat.getDateInstance( DateFormat.MEDIUM, norge ); DateFormat ti = DateFormat.getTimeInstance( DateFormat.SHORT, norge); DateFormat dti = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.SHORT, norge); DateFormat klokkeformat = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.MEDIUM, norge ); SimpleDateFormat sf = new SimpleDateFormat( "dd.MM.yy", norge );
Klassen
Calendardemo
definerer et brukervindu som vist på følgende bilde.
Øverst til venstre er det lagt inn en digital klokke som viser dato og tid
med sekundpresisjon. Til denne brukes et Calendar
-objekt
tid
som
initialiseres til det tidspunktet programmet starter opp:
128 tid = Calendar.getInstance();
Det blir opprettet et Timer
-objekt klokke
som aktiverer
ActionListener
en Klokkelytter
hvert sekund:
129 klokke = new Timer(tidsintervall, new Klokkelytter()); 130 klokke.start();
der tidsintervall
er lik 1000 millisekunder.
(En kort orientering om bruk av Timer
-objekter kan du finne i
notatet Hva er en Timer
?.)
Klokkelytter
øker sekundfeltet til tid
med 1 og
oppdaterer den JLabel
som viser dato og tid:
259 public void actionPerformed(ActionEvent e) 260 { 261 tid.add(Calendar.SECOND, 1); 262 tidsviser.setText(klokkeformat.format(tid.getTime())); 263 }
Programmet bruker også de to Calendar
-objektene
starttid
og sluttid
. Det er tre knapper for å
initialisere starttid
: til aktuell tid
(ved kall på metoden settAktuellTid
), eller til den dato og
eventuelt klokkeslett som leses inn fra tekstfelter
(ved kall på metode settDato
eller
settTidspunkt
).
Når det skal settes verdi for måned, må vi huske på at
Calendar
-objektets datafelt for måned starter på 0. For å få
satt riktig verdi, må vi derfor trekke ifra 1 fra den verdi som leses inn fra
tekstfeltet for måned.
Dersom det bare leses inn
dato, settes klokkeslettet til aktuell tid. I alle disse tre tilfellene settes
sluttid
til samme verdi som starttid
. Begge tider
skrives ut i sine tekstfelter nederst i vinduet.
Ved klikk på knappen "Vis sluttid" blir det lest inn et antall dager og et
antall timer fra de to tekstfeltene for dette bruk (i tilfelle det er skrevet
noe i dem). Starttid settes først lik den verdi sluttid har for øyeblikket.
Deretter adderes det innleste antall dager og timer til sluttiden
(ved kall på metoden leggTilTid
) og verdiene
for begge tider skrives ut (ved kall på metoden visTid
).
Fullstendig programkode, med unntak av main
-metode, er gjengitt
nedenfor. Driverklasse for programmet finnes i fila
Calendartest.java
.
Den Timer
som blir brukt av dette programmet gir ingen
garanti for å kjøre med en bestemt frekvens. Den egner seg derfor ikke til
for eksempel å programmere en klokke. Se for øvrig merknad i notatet
Hva er en Timer
?
1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 import java.util.Calendar; 5 import java.text.DateFormat; 6 7 public class Calendardemo extends JFrame 8 { 9 private JTextField dagfelt, mndfelt, årfelt, timefelt, minuttfelt, 10 antdgfelt, anttimefelt, startfelt, sluttfelt; 11 private JButton aktuelltid, datotid, tidspkttid, visSlutt; 12 private Calendar starttid, sluttid, tid; 13 private Knappelytter lytter; 14 private JLabel tidsviser = new JLabel(); 15 private Timer klokke; 16 private int tidsintervall = 1000; //antall millisekunder 17 private DateFormat df = DateFormat.getInstance(); //gir format som 18 //f.eks. 05.03.12 12:54 19 private DateFormat klokkeformat = DateFormat.getDateTimeInstance( 20 DateFormat.LONG, DateFormat.MEDIUM); 21 //gir format som f.eks. 5. mars 2012 10:46:19 22 23 public Calendardemo() 24 { 25 super("Demonstrasjon av Calendar-klasse"); 26 dagfelt = new JTextField(2); 27 mndfelt = new JTextField(2); 28 årfelt = new JTextField(4); 29 timefelt = new JTextField(2); 30 minuttfelt = new JTextField(2); 31 antdgfelt = new JTextField(2); 32 anttimefelt = new JTextField(2); 33 startfelt = new JTextField(30); 34 startfelt.setEditable(false); 35 sluttfelt = new JTextField(30); 36 sluttfelt.setEditable(false); 37 aktuelltid = new JButton("Sett starttid lik aktuell tid"); 38 datotid = new JButton("Sett starttid lik dato"); 39 tidspkttid = new JButton("Sett starttid lik dato og tidspunkt"); 40 visSlutt = new JButton("Vis sluttid"); 41 42 lytter = new Knappelytter(); 43 aktuelltid.addActionListener(lytter); 44 datotid.addActionListener(lytter); 45 tidspkttid.addActionListener(lytter); 46 visSlutt.addActionListener(lytter); 47 48 JPanel aktuellpanel = new JPanel(); 49 aktuellpanel.setLayout(new BoxLayout(aktuellpanel, 50 BoxLayout.LINE_AXIS)); 51 aktuellpanel.add(tidsviser); 52 aktuellpanel.add(Box.createHorizontalGlue()); 53 aktuellpanel.add(aktuelltid); 54 55 JPanel datopanel = new JPanel(); 56 datopanel.setLayout(new BoxLayout(datopanel, BoxLayout.LINE_AXIS)); 57 datopanel.add(new JLabel("Dag")); 58 datopanel.add(dagfelt); 59 datopanel.add(Box.createRigidArea(new Dimension(10, 0))); 60 datopanel.add(new JLabel("Måned")); 61 datopanel.add(mndfelt); 62 datopanel.add(Box.createRigidArea(new Dimension(10, 0))); 63 datopanel.add(new JLabel("År")); 64 datopanel.add(årfelt); 65 datopanel.add(Box.createRigidArea(new Dimension(10, 0))); 66 datopanel.add(Box.createHorizontalGlue()); 67 datopanel.add(datotid); 68 69 JPanel tidspktpanel = new JPanel(); 70 tidspktpanel.setLayout(new BoxLayout(tidspktpanel, 71 BoxLayout.LINE_AXIS)); 72 tidspktpanel.add(new JLabel("Time")); 73 tidspktpanel.add(timefelt); 74 tidspktpanel.add(Box.createRigidArea(new Dimension(10, 0))); 75 tidspktpanel.add(new JLabel("Minutt")); 76 tidspktpanel.add(minuttfelt); 77 tidspktpanel.add(Box.createRigidArea(new Dimension(10, 0))); 78 tidspktpanel.add(Box.createHorizontalGlue()); 79 tidspktpanel.add(tidspkttid); 80 81 JPanel infopanel = new JPanel(); 82 infopanel.setLayout(new BoxLayout(infopanel, BoxLayout.LINE_AXIS)); 83 infopanel.add(new JLabel("Velg varighet og vis sluttid")); 84 infopanel.add(Box.createHorizontalGlue()); 85 86 JPanel dagpanel = new JPanel(); 87 dagpanel.setLayout(new BoxLayout(dagpanel, BoxLayout.LINE_AXIS)); 88 dagpanel.add(new JLabel("Antall dager")); 89 dagpanel.add(antdgfelt); 90 dagpanel.add(Box.createRigidArea(new Dimension(10, 0))); 91 dagpanel.add(new JLabel("Antall timer")); 92 dagpanel.add(anttimefelt); 93 dagpanel.add(Box.createRigidArea(new Dimension(10, 0))); 94 dagpanel.add(Box.createHorizontalGlue()); 95 dagpanel.add(visSlutt); 96 97 JPanel startpanel = new JPanel(); 98 startpanel.setLayout(new BoxLayout(startpanel, 99 BoxLayout.LINE_AXIS)); 100 startpanel.add(new JLabel("Starttid")); 101 startpanel.add(startfelt); 102 startpanel.add(Box.createHorizontalGlue()); 103 104 JPanel sluttpanel = new JPanel(); 105 sluttpanel.setLayout(new BoxLayout(sluttpanel, 106 BoxLayout.LINE_AXIS)); 107 sluttpanel.add(new JLabel("Sluttid")); 108 sluttpanel.add(sluttfelt); 109 sluttpanel.add(Box.createHorizontalGlue()); 110 111 JPanel c = new JPanel(); 112 c.setLayout(new BoxLayout(c, BoxLayout.PAGE_AXIS)); 113 c.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 114 setContentPane(c); 115 c.add(aktuellpanel); 116 c.add(Box.createRigidArea(new Dimension(0, 10))); 117 c.add(datopanel); 118 c.add(Box.createRigidArea(new Dimension(0, 10))); 119 c.add(tidspktpanel); 120 c.add(Box.createRigidArea(new Dimension(0, 10))); 121 c.add(infopanel); 122 c.add(Box.createRigidArea(new Dimension(0, 10))); 123 c.add(dagpanel); 124 c.add(Box.createRigidArea(new Dimension(0, 10))); 125 c.add(startpanel); 126 c.add(Box.createRigidArea(new Dimension(0, 10))); 127 c.add(sluttpanel); 128 tid = Calendar.getInstance(); 129 klokke = new Timer(tidsintervall, new Klokkelytter()); 130 klokke.start(); 131 pack(); 132 setVisible(true); 133 } 134 135 public void settAktuellTid() 136 { 137 starttid = Calendar.getInstance(); 138 sluttid = Calendar.getInstance(); 139 } 140 141 public void settDato() 142 { 143 try 144 { 145 int dag = Integer.parseInt(dagfelt.getText()); 146 int måned = Integer.parseInt(mndfelt.getText()); 147 int år = Integer.parseInt(årfelt.getText()); 148 starttid = Calendar.getInstance(); 149 starttid.set(år, måned - 1, dag); 150 sluttid = Calendar.getInstance(); 151 sluttid.setTime(starttid.getTime()); 152 } 153 catch (NumberFormatException e) 154 { 155 JOptionPane.showMessageDialog(this, 156 "Bruk heltallsverdier for dato!"); 157 } 158 } 159 160 public void settTidspunkt() 161 { 162 try 163 { 164 int dag = Integer.parseInt(dagfelt.getText()); 165 int måned = Integer.parseInt(mndfelt.getText()); 166 int år = Integer.parseInt(årfelt.getText()); 167 int time = Integer.parseInt(timefelt.getText()); 168 int minutt = Integer.parseInt(minuttfelt.getText()); 169 starttid = Calendar.getInstance(); 170 starttid.set(år, måned - 1, dag, time, minutt); 171 sluttid = Calendar.getInstance(); 172 sluttid.setTime(starttid.getTime()); 173 } 174 catch (NumberFormatException e) 175 { 176 JOptionPane.showMessageDialog(this, 177 "Bruk heltallsverdier for dato!"); 178 } 179 } 180 181 public void visTid(Calendar tid, JTextField sted) 182 { 183 if (tid != null) 184 { 185 sted.setText(df.format(tid.getTime())); 186 } 187 else 188 { 189 sted.setText("Tid ikke satt."); 190 } 191 } 192 193 public void leggTilTid() 194 { 195 try 196 { 197 String input = antdgfelt.getText(); 198 int antDager = 0; 199 if (!input.equals("")) 200 { 201 antDager = Integer.parseInt(input); 202 } 203 if (sluttid != null) 204 { 205 sluttid.add(Calendar.DAY_OF_MONTH, antDager); 206 } 207 int antTimer = 0; 208 input = anttimefelt.getText(); 209 if (!input.equals("")) 210 { 211 antTimer = Integer.parseInt(input); 212 } 213 if (sluttid != null) 214 { 215 sluttid.add(Calendar.HOUR_OF_DAY, antTimer); 216 } 217 } 218 catch (NumberFormatException e) 219 { 220 JOptionPane.showMessageDialog(this, 221 "Bruk heltallsverdier for dato!"); 222 } 223 } 224 225 private class Knappelytter implements ActionListener 226 { 227 public void actionPerformed(ActionEvent e) 228 { 229 if (e.getSource() == aktuelltid) 230 { 231 settAktuellTid(); 232 visTid(starttid, startfelt); 233 visTid(sluttid, sluttfelt); 234 } 235 else if (e.getSource() == datotid) 236 { 237 settDato(); 238 visTid(starttid, startfelt); 239 visTid(sluttid, sluttfelt); 240 } 241 else if (e.getSource() == tidspkttid) 242 { 243 settTidspunkt(); 244 visTid(starttid, startfelt); 245 visTid(sluttid, sluttfelt); 246 } 247 else if (e.getSource() == visSlutt) 248 { 249 starttid.setTime(sluttid.getTime()); 250 leggTilTid(); 251 visTid(starttid, startfelt); 252 visTid(sluttid, sluttfelt); 253 } 254 } 255 } 256 257 private class Klokkelytter implements ActionListener 258 { 259 public void actionPerformed(ActionEvent e) 260 { 261 tid.add(Calendar.SECOND, 1); 262 tidsviser.setText(klokkeformat.format(tid.getTime())); 263 } 264 } 265 }
Innholdsoversikt for programutvikling
Copyright © Kjetil Grønning, revidert av Eva Hadler Vihovde 2014