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

AWT/Swing Java Discussion :

Impossible d'afficher un rond dans une applet


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut Impossible d'afficher un rond dans une applet
    Bonjour à tous,

    Je développe une applet qui devra répertorier toutes des données. J'essaie d'afficher un rond coloré à côté d'un JLabel.

    L'objectif sera d'afficher ce couple autant de fois que le nombre de données reçues, donc si j'ai 20 résultats, je dois afficher 20 couples.

    J'ai essayé de faire un exemple tout simple mais je n'arrive pas à afficher mon rond.

    Voici le code simplifié :

    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
     
    public class Client extends JApplet
    {
        private JButton connect = new JButton("Connection");
        private JButton disconnect = new JButton("Disconnection");
        private static JPanel container = new JPanel();
        private JPanel southButton = new JPanel();
     
        public void init()
        {
            //Propriétés de l'applet
            this.setName("Monitoring");
            this.setSize(1200,800);
            this.showStatus("Waiting for connection...");
     
     
            //Propriétés du container
            container.setBackground(Color.WHITE);
            container.setLayout(new BorderLayout());
     
            //Boutons de connection/Deconnection
            southButton.add(connect);
            southButton.add(disconnect);
            disconnect.setEnabled(false);
     
            //Ajout dans le container
            container.add(new DrawCircle(Color.RED), BorderLayout.CENTER);
            container.add(southButton, BorderLayout.SOUTH);
     
            //Ajout du container à la fenêtre actuelle
            this.setContentPane(container);
            this.setVisible(true); //Affichage de la fenêtre
        }
        class DrawCircle extends JPanel
        {
            private Color c;
            public DrawCircle(Color c)
            {
                this.c = c;
            }
            public void paintComponant(Graphics g)
            {
                g.fillOval(2, 2, 5, 5);
                g.setColor(c);
            }
        }
    }
    Je ne comprend pas pourquoi mon rond ne s'affiche pas =/

    J'ai également une autre question :
    Dans le BorderLayout.CENTER du JPanel principal, j'aimerai ajouter un autre JPanel avec un GridLayout et chaque élément du GridLayout contiendrai le couple cité plus haut, à savoir le rond et un JLabel. Est-ce possible?

    Merci d'avance

    (J'ai posté ici bien que ce soit une applet, c'est plutôt une question niveau Swing que Applet)

    < Nutella >

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Inverse les deux instructions dans "paintComponent". Il faut d'abord choisir la couleur, et ensuite dessiner.
    Ajoute aussi une surcharge de la méthode "getPreferredSize()" pour spéficier la taille du JPanel qui contient le cercle.

  3. #3
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Salut,

    Merci pour ta réponse, malheureusement (ou plutôt heureusement pour moi ) j'ai procédé autrement. Au lieu de dessiner un rond, j'ai été chercher une image que j'affiche dans un JLabel.

    J'me suis cassé la tête deux heures la dessus et comme je trouvais pas, j'ai essayé autre chose.

    Le problème que j'ai et que j'avais avant, c'est que quand je clic sur Connection, je me connecte bien au serveur mais rien ne s'affiche. L'affichage se fait uniquement lorsque je clic sur Disconnection.

    Voici le code complet avec les actionlistener de mes boutons :


    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
    public class Client extends JApplet
    {
        private JButton connect = new JButton("Connection");
        private JButton disconnect = new JButton("Disconnection");
        private static JPanel container = new JPanel();
        private JPanel southButton = new JPanel();    
        private JLabel welcome = new JLabel("Welcome to the db monitoring applet");
     
        public void init()
        {
            //Propriétés de l'applet
            this.setName("Monitoring");
            this.setSize(1200,800);
            this.showStatus("Waiting for connection...");
     
     
            //Propriétés du container
            container.setBackground(Color.WHITE);
            container.setLayout(new BorderLayout());
     
            //Propriétés du label welcome.
            Font police = new Font("Tahoma",Font.BOLD,55);
            welcome.setBackground(Color.WHITE);
            welcome.setFont(police);
            welcome.setForeground(Color.BLACK);
            welcome.setHorizontalAlignment(JLabel.CENTER);
     
            //Boutons de connection/Deconnection
            southButton.add(connect);
            southButton.add(disconnect);
            disconnect.setEnabled(false);
     
            //Ajout dans le container
            container.add(welcome, BorderLayout.CENTER);
            container.add(southButton, BorderLayout.SOUTH);
     
            //Ajout du container à la fenêtre actuelle
            this.setContentPane(container);
            this.setVisible(true); //Affichage de la fenêtre
        }
        class ButtonConnect implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                connect.setEnabled(false);
                disconnect.setEnabled(true);
                welcome.setVisible(false);
                welcome.setForeground(Color.BLACK);
                welcome.setText("Welcome to the server !!!!!");
     
                clientT = new ClientThread();
                clientT.start();
            }
        }
        class ButtonDisconnect implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                clientT.stopThread();
                connect.setEnabled(true);
                disconnect.setEnabled(false);
                welcome.setText("Disconnected from the server...");
            }        
        }
    }
    ButtonConnect lance le thread qui va envoyer des messages au serveur et recevoir les réponses. Ensuite le thread appelle la méthode draw(ArrayList) de ma class Client. Dans cette méthode, j'ajoute un JPanel avec toute mes infos.

    Comme j'ai dit précédement, les infos ne s'affichent qu'une fois que je suis déconnecté. Voici le résumé de ma méthode draw()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static void draw(ArrayList<String> answer)
    {
       JPanel statusDB = new JPanel();
       //création du JPanel avec toutes les infos
       container.add(statusDB, BorderLayout.CENTER);
    }
    En principe le thread fait appel à cette méthode toutes les 20 secondes => l'affiche devrait être mis à jour à chaque fois. Mais ça ne fonctionne pas.

    Il faudrait faire comme un repaint()? Ou qqch du genre?

    Encore merci pour ta réponse.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tente un appel à la méthode "revalidate" après l'ajout du nouveau JPanel.

  5. #5
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Salut,

    Alors j'ai ajouté revalidate() à la fin de ma méthode draw() et ça fonctionne correctement. Donc quand je clic sur connecter le message de bienvenue s'efface et l'affichage voulu apparaît.

    Le hic c'est qu'il ne se raffraichi pas. Une fois connecté l'appel à ma méthode draw() se fait toutes les 15 secondes mais les modifications ne sont pas visible dans l'applet. Mes ToolTipText des images devraient être mis à jour mais rien ne se passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    container.add(statusDB, BorderLayout.CENTER);
    container.revalidate();
    Ce sont les deux dernières lignes de ma méthode draw().
    statusDB est le JPanel qui contient toutes les nouvelles infos à chaque raffraichissement.

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Donne le code complet

  7. #7
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    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
       public static void display(ArrayList<String> answer)
        {
            JPanel statusDB = new JPanel();
            statusDB.setLayout(new GridLayout(40, 5));//, 2, 2));
            for(int i = 1; i < answer.size(); i = i + 2)
            {
                JPanel oneDB = new JPanel();
                GridLayout fL = new GridLayout(1,2);
                oneDB.setLayout(fL);
     
                String[] value = answer.get(i).split(" ");
                JPanel pane = new JPanel();
                JLabel image = new JLabel(new ImageIcon("down3.jpg"));
                pane.setLayout(new BorderLayout());
                pane.add(image);
                pane.revalidate();
     
                JPanel nameDB = new JPanel();
                JLabel name = new JLabel(value[0]);
                Font nameFont = new Font("Tahoma",Font.BOLD,8);
                name.setFont(nameFont);
                nameDB.setToolTipText(value[0]);
                nameDB.add(name);
     
                oneDB.add(pane);
                oneDB.add(nameDB);
     
                statusDB.add(oneDB);
            }
            container.add(statusDB, BorderLayout.CENTER);
            container.revalidate();        
        }

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Et ta méthode "display", elle est appelée à quel moment ? Combien de fois ?

  9. #9
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Eu j'ai changé le nom de ma méthode sans le vouloir, désolé

    display() = draw()

    C'est la même méthode.

    Ya un thread client qui communique avec le serveur et qui appelle la méthode toutes les 15 secondes.

    Donc en gros :

    l'applet se lance, on clic sur connect et le thread client communique avec le serveur et appelle la méthode draw() qui met à jour les infos de l'applet.

    [EDIT]J'ai compris mon problème. Mon panel central se met bien à jour. Le seul truc qui ne se met pas à jour c'est le ToolTipText. Au lieu d'afficher des noms fixes, j'ai affiché des chiffres aléatoires et l'applet se met bien à jour toutes les 15 secondes. Je vais continuer à chercher pour le ToolTipText()
    [/EDIT]

  10. #10
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Bon et bien je viens de trouver comment mettre à jour le ToolTipText.

    A chaque appel de ma méthode draw(), je supprime le panel central et je le recrée.

    Je pensais que le fait de recréer JPanel permettrai de modifier le ToolTip, faut croire que non

    Merci beaucoup dino,

    < Nutella >

Discussions similaires

  1. Impossible de récupérer ma webcam dans une applet
    Par drasalmed dans le forum Applets
    Réponses: 0
    Dernier message: 07/01/2011, 16h29
  2. afficher image dicom dans une applet
    Par amnass dans le forum Applets
    Réponses: 7
    Dernier message: 04/04/2009, 15h37
  3. afficher image java dans une applet
    Par xheo dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 12/03/2009, 15h19
  4. Comment afficher le chinois dans une applet
    Par SoldierOfFortune dans le forum Applets
    Réponses: 6
    Dernier message: 23/08/2008, 13h54
  5. Réponses: 6
    Dernier message: 14/06/2007, 12h13

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