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

Interfaces Graphiques en Java Discussion :

Passage d'un applet à un élément d'interface


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Par défaut Passage d'un applet à un élément d'interface
    Bonjour,

    depuis quelques jours j'essaie de faire un timer pour un jeu d'échec (qui décrémente jusqu'à arriver à un temps de 0), mais je rencontre quelques difficultés.

    J'ai tout d'abord orienté mes recherches vers google et regardé quelques codes de simples horloges, essayé de les simplifier etc... En général je tombe sur des applets, alors que je veux juste insérer mon Timer dans un JTextField non éditable, dans une interface type Swing.

    En gros j'ai vu 2 solutions :
    - l'utilisation du constructeur Timer(int, actionListener) : problème, Eclipse dit ne pas connaitre ce constructeur, et j'ai cru comprendre qu'il bloquait la fenêtre tant qu'il était éxécuté.
    - l'utilisation de thread, j'ai eu du mal à comprendre, et pareil j'ai l'impression que ça bloque, mais pas sur non plus.

    bref, voici le code que j'ai le plus réduit, sous forme d'applet, et qui donne une horloge en format texte. J'aimerais juste que l'on m'aide à passer d'un applet à un élément insérable dans une interface.
    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
     
    package Clock;
     
    import java.applet.Applet;
    import java.awt.*;
    import java.util.Date;
     
    public class clock extends Applet implements Runnable {
     
    	 private Thread thclock;
    	 MediaTracker tracker;
    	 public int CurrHour;
    	 public int CurrMin;
    	 public int CurrSec;
    	 Image offScreenImage;
    	 Graphics offScreen;
     
     public void paint(Graphics g)
     {
    	 offScreen.clearRect(0, 0, 100, 50);
         Date date = new Date();
         CurrSec = date.getSeconds();
         CurrMin = date.getMinutes();
         CurrHour = date.getHours();
         offScreen.drawString(""+CurrHour+":"+CurrMin+":"+CurrSec, 15, 15);
         g.drawImage(offScreenImage, 0, 0, this);
     }
     
     public void start()
     {
    	 thclock = new Thread(this);
         thclock.start();     
     }
     
     public void run()
     {
         do
             try
             {
                 paint(getGraphics());
                 Thread.sleep(100L);
             }
             catch(InterruptedException _ex) { }
         while(true);
     }
     
     public void init()
     {
         offScreenImage = createImage(200, 200);
         offScreen = offScreenImage.getGraphics();     
     }
    }
    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Bonjour,

    Plutôt que de vouloir faire rentrer le code d'une Applet trouvée sur Internet au sein de ton application, mieux vaut implémenter ton propre Timer.

    Ci-dessous un exemple qui compile et fonctionne (appeler le fichier "Exemple085_Chronometre_Echec.java").

    La classe ChronometrePanel contient le chronomètre. En appuyant sur le bouton "Start", le chronomètre se déclenche à partir de 1min10s. Le temps est accéléré pour voir plus vite ce qui se passe.

    La classe MainApplication contient l'application dans son ensemble. En base de la fenêtre, un texte change pour montrer que l'application n'est pas figée. Quand le chronomètre arrive à zéro, ce texte passe en rouge. Ceci sert à montrer l'interaction entre le chronomètre et le reste de l'application.

    En espérant que cela puisse aider...

    Cordialement,

    Nicolas

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    // appeler le fichier Exemple085_Chronometre_Echec.java
    // le lundi 19 février 2007
    // par Nicolas_75
    // pour http://www.developpez.net/forums/showthread.php?t=281766
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.*;
     
    // le chronomètre lui-même :
    class ChronometrePanel extends JPanel {
     
        // valeur initiale du chronomètre (1 min 10 s) :
        final public static int h_INITIAL = 0;
        final public static int m_INITIAL = 1;
        final public static int s_INITIAL = 10;
     
        // rythme du chronomètre :
        // (mettre 1000 pour un chronomètre temps réel battant la seconde)
        final public static int DURATION_ONE_SECOND = 200; 
     
        // champs :
        MainApplication mainApp; // référence sur l'application principale
        JButton startButton = new JButton("Start");
        JButton stopButton = new JButton("Stop");
        int h; // heure affichée par le chronomètre
        int m; // minute affichée par le chronomètre
        int s; // seconde affichée par le chronomètre
        JLabel chronoLabel = new JLabel(this.h+":"+this.m+":"+this.s);
        java.util.Timer timer = null;
     
        // constructeur :
        public ChronometrePanel(MainApplication mainApp) {
     
            // on garde une référence sur l'application principale :
            this.mainApp = mainApp;
     
            // mise en place de la fonctionnalité du
            // bouton Start :
            startButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    if (timer==null) { // si le chronomètre n'est pas encore en marche
                        // initialisation de l'affichage :
                        h = h_INITIAL;
                        m = m_INITIAL;
                        s = s_INITIAL;
                        // le texte en bas de l'application est écrit en noir :
                        ChronometrePanel.this.mainApp.setBlackColor();
                        // lancement du chronomètre :
                        timer = new java.util.Timer();
                        TimerTask tache = new TimerTask() {
                            public void run() {
                                decreaseOneSecond();
                            }
                        };
                        timer.schedule(tache, 0, DURATION_ONE_SECOND);
                        // en résumé, toutes les secondes, 
                        // on appelle decreaseOneSecond()
                    }
                }
            } );
     
            // mise en place de la fonctionnalité du
            // bouton Suspend :
            stopButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    if (timer!=null) { // si le chronomètre est en marche
                        timer.cancel(); // on l'arrête
                        timer = null;
                    }
                }
            });
     
            // mise en place du JPanel :
            this.setLayout(new GridLayout(1,4));
            add(startButton);
            add(stopButton);
            add(new JLabel("")); // pour faire un peu d'espace
            add(chronoLabel);
        }
     
        // méthode pour diminuer l'affichage d'une seconde :
        public void decreaseOneSecond()  {
            this.s--;
            if(this.s==-1) { this.s=59; this.m--; }
            if(this.m==-1) { this.m=59; this.h--; }
            if ((h==0)&&(m==0)&&(s==0)) { // le temps est écoulé
                timer.cancel(); // on arrête le chronomètre
                timer = null;
                // on passe le texte de l'application principale en rouge :
                mainApp.setRedColor();
            }
            // on modifie l'affichage :
            chronoLabel.setText(this.h+":"+this.m+":"+this.s);
        }
    }
     
    // application principale :
    class MainApplication extends JFrame {
     
        // couleur pour écrire le texte en base de la fenêtre :
        // (sera modifiée plus tard)
        private Color color = Color.BLACK;
     
        // constructeur :
        public MainApplication() {
     
            // disposition de la fenêtre contenant l'application principale :
            this.setResizable(false);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setSize(400, 100);
            this.setLayout(new GridLayout(2,1));
     
            // inclusion du chronomètre :
            // (classe ci-dessus)
            ChronometrePanel chronoPanel = new ChronometrePanel(this);
            this.add(chronoPanel);
     
            // création d'un autre JLabel montrant que
            // l'application n'est pas bloquée :
            JLabel notSuspended = new JLabel();
            this.add(notSuspended);
     
            // affichage de la fenêtre contenant l'application :
            this.setVisible(true);
     
            // pour montrer que l'application n'est pas gelée :
            for (int i=0;;i++) {
                if (i==10) i=0;
                notSuspended.setForeground(this.color);
                notSuspended.setText("et l'application continue ! ("+i+")");
                try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace(); }
            }
        }
     
        public void setRedColor() {
            this.color = Color.RED;
        }
     
         public void setBlackColor() {
            this.color = Color.BLACK;
        }
    }
     
    // lanceur :
    public class Exemple085_Chronometre_Echec {
        public static void main(String[] args) {
            new MainApplication();
        }
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Par défaut
    Effectivement ça va bien m'aider je pense. Je bosse la dessus cette après midi.

    En fait je savais pas du tout comment faire et c'est pour ça que je cherchais du code dans des applets, pour avoir au moins les méthodes pour le faire, vu que c'est ce que l'on rencontre le plus souvent sur le net.

    Dans tous les cas, merci pour ta réponse et ta rapidité Nico

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Je t'en prie. Bon courage.

  5. #5
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut Timer Applet
    Ben c'est pas très comliqué pour insérer une applet dans une autre application.
    - L'applet JApplet se comporte comme un JComponent sauf qu'il faut l'initialiser avec init() et non pas seulement le constructeur général.
    - pour le Timer il y a en fait 2 solutions:
    . celle de "Nico" est l'originale; c'est le Timer java.util.Timer qui intègre une instance Runnable.
    . celle de Swing est javax.swing.Timer qui intègre plutôt un ActionListener en paramètre; si Eclipse ne reconnaît pas c'est que tu n'as pas indiqué le package exact probablement, habituellement confondu avec le Timer original.
    Voilà.
    Citation Envoyé par rami883
    (...)

    J'ai tout d'abord orienté mes recherches vers google et regardé quelques codes de simples horloges, essayé de les simplifier etc... En général je tombe sur des applets, alors que je veux juste insérer mon Timer dans un JTextField non éditable, dans une interface type Swing.

    En gros j'ai vu 2 solutions :
    - l'utilisation du constructeur Timer(int, actionListener) : problème, Eclipse dit ne pas connaitre ce constructeur, et j'ai cru comprendre qu'il bloquait la fenêtre tant qu'il était éxécuté.
    - l'utilisation de thread, j'ai eu du mal à comprendre, et pareil j'ai l'impression que ça bloque, mais pas sur non plus.
    (...)
    Merci

Discussions similaires

  1. Comment construire des éléments d'interface dans un backgroundworker ?
    Par billybobbonnet dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 10/09/2014, 14h05
  2. gestion des aute élément d'interface suivant l'état d'un expander
    Par boubou38 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 26/07/2012, 10h50
  3. [ubuntu] Bug, éléments d'interface noirs.
    Par VisitorG dans le forum Eclipse
    Réponses: 1
    Dernier message: 07/08/2008, 15h19
  4. Passage du nom d'un élément par une fonction
    Par black is beautiful dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/11/2007, 15h12
  5. Internationnalisation et disposition des éléments d'interface
    Par nicoboud2 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/04/2007, 13h22

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