IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[Composant] Affichage d'un horloge


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut [Composant] Affichage d'un horloge
    Bonjour,


    j'ai développé une sous-classe d'un composant JLabel qui affiche la date et l'heure actuelle. Débutant, j'ai besoin d'être guidé pour savoir si je m'y prends correctement ou pas. J'aimerais avoir votre avis sur cette classe.
    Donnez moi vos remarques et observations sur la classe, le style de programmation...
    Comment auriez-vous procéder ?
    Quelles méthodes auriez-vous implémenté ?
    Quelles propriétés auriez-vous défini ?
    Trouvez-vous cette classe interessante ?
    etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    /*
     * Clock.java
     *
     * Created on 4 septembre 2005, 19:46
     *
     */
     
    package tutothreadsun;
     
    import java.lang.Runnable;
    import java.awt.Color;
    import java.util.Date;
    import java.lang.InterruptedException;
    import javax.swing.JLabel;
    import java.text.DateFormat;
    import java.util.Locale;
     
    /**
     *
     * @author zoax
     * @version 1.0
     */
    public class Clock extends JLabel implements Runnable {
        private volatile Thread clockThread;        //Thread 
        private Date currentDate;                           //Stocke la date actuelle
        private DateFormat formatter;                       //Formatte la date
        private Locale locale;
     
        /** Crée une nouvelle instance de Clock
         *  @param noparam aucun paramètre
         *  @return noreturn aucune valeur de retour
         *  @exception noexception aucune exception
         */ 
        public Clock() {
            setSize(275,25);                            //Définit la taille du composant.
            currentDate=new Date();                     //Initialisation de la date actuelle
            locale=Locale.getDefault();
            formatter=DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.MEDIUM, locale); //Formattage 
            setText(formatter.format(currentDate));     //Initialisation du texte du JLabel
            clockThread=new Thread(this, "Clock");      //Déclaration du Thread
            clockThread.start();                        //Lancement du Thread
        }
     
        /**Lancement du Thread
         *  @param noparam aucun paramètre
         *  @return noreturn aucune valeur de retour
         *  @exception noexception aucune exception
         */ 
        public void run(){
            Thread myThread=Thread.currentThread();
            while (clockThread==myThread){
                updateClock();
                try {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e){}
            }
        }
     
        /**Mise à jour de la date
         *  @param noparam aucun paramètre
         *  @return noreturn aucune valeur de retour
         *  @exception noexception aucune exception
         */ 
        private void updateClock() {
            String today;                               //date du jour de type String
     
            currentDate=new Date();                     //Date et heure actuelle
            today=formatter.format(currentDate);        //formatte de la date et de l'heure actuelle
            setText(formatter.format(currentDate));     //Mise à jour du texte du JLabel
            currentDate=null;
        }
     
        public static void main(String[] args){
            Clock appli=new Clock();
        }
    }
    Merci d'avance pour toutes vos remarques.
    Ca va bien m'aider.
    Ciao.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Pense à changer la priorité de ta thread sinon elle aura celle de la thread de Swing qui est assez élevée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     clockTread.setPriority(Thread.NORM_PRIORITY);
    Ce n'est pas trop grave car le JLabel est un composant simple donc là ça ne devrait pas trop causer de pb mais tu ferais mieux de mettre à jour son texte avec SwingUtilities.invokeLater() paske Swing n'aime pas trop les autres threads (tu t'en appercevras si tu utilises ton code tel quel sur des tables ou des arbres => ca plantera de temps à autre car la modification aura lieu au moment du repaint).

    Qq chose come ca ou une variation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void updateClock() { 
      SwingUtilities.invokeLater(new Runnable() {
        public void run() {
          currentDate=new Date(); //Date et heure actuelle 
          String today=formatter.format(currentDate); //formatte de la date et de l'heure actuelle.
          currentDate = null; 
          setText(today);
        }
      });
    }
    Tu peux vérifer si le composant est visible et affiché et éviter de mettre à jour son texte s'il ne l'est pas. Idem tu peux lancer/stopper ta thread uniquement s'il est affiché/caché (voir java.awt.event.ComponentListener) plutôt que dans le constructeur.

    Qoi d'autre??? Hum peut-être dormir 999ms plutot que 1000ms mais là c'est plutôt pour pinailler.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut
    Ok
    je te remercie bien pour ta réponse.
    Et sinon, ai-je bien fait de faire une sous-classe de JLabel ?
    Je me demande en fait si je n'aurai pas dû développer une classe indépendemment de l'aspect graphique puis d'ajouter l'aspect graphique dans une sous-classe ?
    Qu'en penses-tu ?

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Cela depend si la classe que tu as te conviens telle quelle ou si tu prefererai avoir a partir de la meme thread des representations differentes :
    - style JLabel (simple texte facile).
    - style horloge humerique (avec rendu type LCD)
    - style horloge analogique (cadran de montre).
    - style horloge analogique (avec defilement des chiffres style panneau d'affichage dans une gare).
    - style label en 3D (economiseur d'ecran Windows) via un panel dans lequel on a un rendu Java3D.
    ...

    Alors mieux vaudra peut-etre etendre JComponent ou JPanel et definir des UIDelegates appropries pour chaque type de rendu.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut
    Bonjour,

    je voulais savoir ce qu'était UIDelegates, car je n'ai pas trouvé énormément d'infos.

    Merci d'avance.
    Ciao.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JComponent.html
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/plaf/ComponentUI.html
    Bien que principalement dedie au support de LnF differents, ca peut aussi permettre a un meme composant d'avoir plusieurs apparences.
    L'UI delegate est le vrai resposable permettant de trouver la taille et le layout du composant, le dessiner, ...

    ex concret : ce n'est pas la JComboBox qui es responsable de son dessin c'est son UIDelegate. D'ou le fait qu'on a des combo differentes pour chacun des look n feel. => Y a pas un gros switch dans le code de JComboBox qui dit if (metal) { ... } else if (windows) {...} else if ...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut
    Salut,

    je te remercie bien pour tes réponses.

    Je vais de ce pas, sélectionner "Resolu"

    Ciao.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage d'une horloge
    Par crach12 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/12/2012, 07h45
  2. [XL-2003] affichage d'une horloge dynamique sous exel
    Par frihat mohamed dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 15/08/2011, 18h42
  3. [sfGuard] sfDoctrineGuardPlugin + Login + composant + affichage des erreurs
    Par khand dans le forum Plugins
    Réponses: 3
    Dernier message: 02/08/2011, 08h48
  4. [javabean composant] Affichage run-time
    Par Pierre Maurette dans le forum Langage
    Réponses: 2
    Dernier message: 03/07/2006, 14h32
  5. Choix de composant affichage messages réseaux
    Par sozie9372 dans le forum Graphisme
    Réponses: 2
    Dernier message: 19/05/2006, 15h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo