Java : Plynulá změna data a času
Jak jednoduše docílit plynulé změny data a času v Javě.
Pro vytvoření aktuálního data má Java přímo implementované metoty v java.util.Date. Vytvoření
proměnné s obsahem aktuálního data je proto velice snadné.
V tomto jednoduchém příkladu si uděláme JFrame okno, ve kterém se bude plynule zobrazovat a přepisovat aktuální čas a datum. Čas se bude zobrazovat ve dvou variantách. Poprvé v titulku okna a podruhé v JPanelu umístěném v okně.
V titulku okna se bude zobrazovat pouze aktuální čas, v JPanelu se bude kromě času zobrazovat i aktuální datum.
Pro získání těchto dvou hodnot si vytvoříme dvě proměnné typu SimpleDateFormat, pro které později implementujeme pomocí metody format() Date:
1 2 |
SimpleDateFormat dateformat = new SimpleDateFormat("HH:mm:ss"); SimpleDateFormat dates = new SimpleDateFormat("dd.M.yyyy HH:mm:ss"); |
První SimpleDateFormat použijeme pro získáni informací pouze o čase ve formátu:
1 |
Hodina:minuta:sekudna |
Druhý SimpleDateFormat obsahuje navíc ještě datum:
1 |
den.měsíc.rok Hodina:minuta:sekunda |
Pro použití si musíme vytvořit novou proměnnou typu Date, ze které pomocí vytvořeného formátu získáme požadovanou hodnotu:
1 2 3 |
Date date = new Date(); dateformat.format(date); dates.format(date); |
Nakonec kód celého příkladu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import java.awt.BorderLayout; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; //trida implementuje Runnable public class datetime extends JFrame implements Runnable { //private JLabel, ve kterem se bude zobrazovat cas private JLabel now = new JLabel("...", JLabel.CENTER); //konstruktor public datetime() { //nastaveni titulku okna (titulek se prekresli aktualnim casem) setTitle("Timer"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //nastaveni rozmeru setSize(200, 100); //vytvoreni noveho panelu JPanel contentPane = (JPanel) getContentPane(); contentPane.add(now, BorderLayout.CENTER); setVisible(true); //spusteni noveho Threadu Thread th = new Thread(this); th.start(); } //implementovana trida run public void run() { //nekonecny cyklus pro neustalou aktualizaci casu while( true ){ //vytvoreni masky pro cas //zobrazuje se v titulku okna SimpleDateFormat dateformat = new SimpleDateFormat("HH:mm:ss"); //vytvoreni masky pro datum a cas //zobrazuje se v panelu SimpleDateFormat dates = new SimpleDateFormat("dd.M.yyyy HH:mm:ss"); //new Date Date date = new Date(); //v JLabelu zmenime datum a cas now.setText(dates.format(date)); //v titulku okna menime cas this.setTitle(dateformat.format(date)); try { //cekame sekundu Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
Tento progrem není dobře ošetřen, protože i po zavření okna zůstává jedno vlákno v běhu.
Dobry den,
dekuji za upozorneni.
Do ukazkoveho prikladu jsem doplnil DefaultCloseOperatio n
Zdravim. Super stranky. K tomuto prikladu – pro vylepseni. Nekde jsem cetl, ze pro periodickou aktualizaci dat (hlavne v GUI) je doporucovano misto nekonecne smycky v Thread pouziti tridy Timer, do ktereho se prida uloha (trida) TimerTask.
Diky za tip, vyzkousim.