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 :

[JButton] Problème d'affichage/rafraîchissement


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut [JButton] Problème d'affichage/rafraîchissement
    Bonjour à tous !

    voilà mon soucis :
    Dans un JPanel, j'ai 5 JButton différents : ajout, suppression, édition, valider et annuler, ainsi qu'un JTextfield.
    Dans un autre j'ai un JList.
    Au départ, il n'y a que les 3 premiers qui sont visibles (cf. 1e pièce jointe) et lorsque l'on va cliquer sur ajouter, ou éditer, ces 3 JButton vont disparaître pour laisser la place aux 2 autres (cf. 2e pièce jointe). Il sont donc au même endroit (dans le layout) et voici comment ils sont construits :
    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
    JPanel pnlDTravaux = new JPanel();
     
    pnlDTravaux.setLayout(new GridBagLayout());
     
    gbc.gridheight = 1;//gbc est de type GridBagConstraints
    gbc.gridwidth = 3;
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(2, 2, 3, 2);
     
    JPanel pnlBtn13 = new JPanel();
    pnlBtn13.setLayout(new GridLayout(1, 3, 5, 0));
     
    pnlBtn13.add(btnPlusTravaux);
    btnPlusTravaux.setToolTipText("Ajouter un nouveau type de travaux");
    pnlBtn13.add(btnMoinsTravaux);
    btnMoinsTravaux.setToolTipText("Supprimer le type de travaux sélectionné");
    pnlBtn13.add(btnEditTravaux);
    btnEditTravaux.setToolTipText("Modifier les informations");
     
    pnlDTravaux.add(pnlBtn13, gbc);
     
    JPanel pnlBtn23 = new JPanel();
    pnlBtn23.setLayout(new GridLayout(1, 3, 5, 0));
     
    pnlBtn23.add(btnValTravaux);
    pnlBtn23.add(btnAnnTravaux);
     
    btnValTravaux.setVisible(false);
    btnAnnTravaux.setVisible(false);
     
    pnlDTravaux.add(pnlBtn23, gbc);
     
    gbc.gridy++;
     
    pnlDTravaux.add(new JLabel("Type de travaux"), gbc);
     
    gbc.gridy++;
     
    pnlDTravaux.add(tfTravaux, gbc);
     
    pnlTravaux.add(pnlDTravaux, BorderLayout.CENTER);
    les listener sont ajoutés plus loin dans le code, pas de problème là-dessus, les actions s'effectuent :
    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
    		if(btn == btnPlusTravaux)
    		{
    			edtTravaux = false;//boolean indiquant si on est en mode édition (après clic btnEditionTravaux) ou dans le cas d'un nouveau type de travaux
    			tfTravaux.setText("");
    			listTravaux.setEnabled(false);
    			passerModeEdition(tfTravaux, true, btnPlusTravaux, btnMoinsTravaux, btnEditTravaux, btnValTravaux, btnAnnTravaux);
    		}
    		else if(btn == btnMoinsTravaux)
    		{
    			alTravaux.remove(listTravaux.getSelectedIndex());
    			String[] tabTravaux = new String[alTravaux.size()];
    			for(int u = 0 ; u < tabTravaux.length ; u++)
    				tabTravaux[u] = alTravaux.get(u).getTravaux();
    			listTravaux = new JList(tabTravaux);
    			listTravaux.updateUI();
    			listTravaux.repaint();
    		}
    		else if(btn == btnEditTravaux)
    		{
    			edtTravaux = true;
    			listTravaux.setEnabled(false);
    			passerModeEdition(tfTravaux, true, btnPlusTravaux, btnMoinsTravaux, btnEditTravaux, btnValTravaux, btnAnnTravaux);
    		}
    		else if(btn == btnValTravaux)
    		{
    			if(!tfTravaux.getText().trim().equals(""))
    			{
    				if(edtTravaux)
    					alTravaux.set(listTravaux.getSelectedIndex(), new Travaux(tfTravaux.getText()));
    				else
    					alTravaux.add(new Travaux(tfTravaux.getText()));
    				String[] tabTravaux = new String[alTravaux.size()];
    				for(int u = 0 ; u < tabTravaux.length ; u++)
    					tabTravaux[u] = alTravaux.get(u).getTravaux();
    				listTravaux = new JList(tabTravaux);
    				listTravaux.updateUI();
    				listTravaux.repaint();
    				edtTravaux = false;
    				passerModeEdition(tfTravaux, false, btnPlusTravaux, btnMoinsTravaux, btnEditTravaux, btnValTravaux, btnAnnTravaux);
    				listTravaux.setEnabled(true);
    			}
    			else
    			{
    				//TODO JOptionPane blabla pas de type vide...
    			}
    		}
    		else if(btn == btnAnnTravaux)
    		{
    			edtTravaux = false;
    			passerModeEdition(tfTravaux, false, btnPlusTravaux, btnMoinsTravaux, btnEditTravaux, btnValTravaux, btnAnnTravaux);
    			listTravaux.setEnabled(true);
    		}
    Je sais que c'est code n'est pas hyper hyper propre mais pour l'instant, je vais déjà essayer de le faire fonctionner "graphiquement", je verrai plus tard pour le rendre plus propre...

    La méthode passerModeEdition() sert à ... bin passer ou non en mode édition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void passerModeEdition(JTextField tf, boolean edition, JButton btnAjout, JButton btnSup, JButton BtnEdit, JButton btnVal, JButton btnAnn) {
    	tf.setEditable(edition);
    	btnAjout.setVisible(!edition);
    	btnSup.setVisible(!edition);
    	BtnEdit.setVisible(!edition);
    	btnVal.setVisible(edition);
    	btnAnn.setVisible(edition);
    	btnAjout.repaint();
    	btnSup.repaint();
    	BtnEdit.repaint();
    	btnVal.repaint();
    	btnAnn.repaint();
    }
    Et je pense que c'est justement ici que ça foire... j'ai essayé repaint, validate, revalidate, et même updateUI, sur les composants, et sur les containers de ces composants et pourtant une erreur subsiste. En fait le changement se fait correctement, mais les JButton ne s'affichent pas : il faut que je passe la souris par dessus pour qu'il apparaisse. Ce qui n'est pas très pratique, je vous l'accorde...

    Quelqu'un pourrait-il m'aider siouplaît ?

    Merci d'avance
    Images attachées Images attachées   

  2. #2
    Membre éclairé
    Avatar de omar344
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2007
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 287
    Par défaut
    Salut, je crois que tu dois aussi utiliser la méthode revalidate()

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut
    Citation Envoyé par omar344 Voir le message
    utiliser la méthode revalidate()
    En plus du repaint() ?

    EDIT : j'ai essayé avant, après, et sans le repaint, rien ne fonctionne

  4. #4
    Membre très actif
    Inscrit en
    Janvier 2004
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 208
    Par défaut
    salut

    il me semble que ce sera plutot le JPanel a revalider car c'est lui le conteneur

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut
    Salut,

    j'ai déjà revalidé le JPanel où se trouvait ces composants (cf. 1er message) mais rien ne change

    EDIT : tous ces composants s'inscrivent dans un "grand" JPanel, où d'autres JPanel comme celui décrit dans le 1er message sont présents. Je sais que normalement, il ne faut pas TOUT revalider pour ne pas "perdre" de temps, mais bon, j'ai essayé quand même, et résultat, au moment de passer de l'affichage des 3 boutons au 2 boutons, il ne se passe rien de spécial (obligé de repasser la souris sur le bouton valider pour l'afficher) mais par contre, lorsque l'on passe des 2 boutons, au 3, l'affichage se fait correctement pourtant, c'est la même fonction qui est appelée...

    J'ai changé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void passerModeEdition(JTextField tf, boolean edition, JButton btnAjout, JButton btnSup, JButton btnEdit, JButton btnVal, JButton btnAnn) {
    	tf.setEditable(edition);
    	btnAjout.setVisible(!edition);
    	btnSup.setVisible(!edition);
    	btnEdit.setVisible(!edition);
    	btnVal.setVisible(edition);
    	btnAnn.setVisible(edition);
     
    	this.revalidate();//
    	this.repaint();//
    }
    J'ai remarqué un autre détail, lors du passage 3 ==> 2, que ce soit en cliquant sur Edition ou Ajout, le bouton Annuler s'affiche, mais pas Valider


    De plus en plus bizarre...

  6. #6
    Membre très actif
    Inscrit en
    Janvier 2004
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 208
    Par défaut
    Mais this.revalidate() et this.repaint() c'est qui ?
    Ton JPanel ou le JFrame ?

  7. #7
    Membre très actif
    Inscrit en
    Janvier 2004
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 208
    Par défaut
    Étant en auto formation sur java, J'ai fait des tests de mon coté afin de comprendre.
    C'est loin d’être optimal(je connais peu java), mais ca pourra peut être t'aider.

    J'ai utilisé des JButtons et des JCheckBox de manière dynamique.

    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
     
    package util;
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
     
     
    class TestPanelVisible extends JFrame implements ActionListener{
     
        private JPanel PanelMilieu, PanelHaut;
        private JButton btn1;
        private ArrayList<JButton> buttons;
     
        private static int nbr = 1000;
     
        public TestPanelVisible(){
     
            //Taille de l'ecran
            Toolkit tk = Toolkit.getDefaultToolkit();
            Dimension dim = tk.getScreenSize();
     
            setTitle("Test Visible");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(dim.width / 3, dim.height /3);
            setLocationRelativeTo(null);
     
            Container contenu = getContentPane();
            buttons = new ArrayList<JButton>();
     
            btn1 = new JButton("Ajouter Bouton");
            btn1.addActionListener(this);
     
     
            //Creation JPanel
            PanelMilieu = new JPanel(new FlowLayout(FlowLayout.CENTER));
     
            PanelHaut = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
            PanelHaut.add(btn1);
     
            contenu.add(PanelHaut, BorderLayout.NORTH);
            contenu.add(PanelMilieu);
        }
     
        @Override
        public void actionPerformed(ActionEvent e) {
     
            if(e.getSource() == btn1){
                JButton btn = new JButton("Bouton " + nbr);
                btn.setActionCommand(Integer.toString(nbr));
                btn.addActionListener(this);
     
                buttons.add(btn);
     
                PanelMilieu.add(btn);
                //PanelMilieu.repaint();
                PanelMilieu.validate();
     
                nbr++;
     
                System.out.println(buttons.size());
     
            } else if(e.getSource() instanceof JButton){
     
                JButton btn = (JButton)e.getSource();
                btn.setVisible(false);
     
                JCheckBox cbox = new JCheckBox("ID "  + e.getActionCommand());
                cbox.setActionCommand(e.getActionCommand());
                cbox.addActionListener(this);
     
                PanelHaut.add(cbox);
                PanelHaut.validate();
                //PanelHaut.repaint();
            }
     
            if(e.getSource() instanceof JCheckBox){
     
                JCheckBox cbox = (JCheckBox)e.getSource();
                if(cbox.isSelected()){
                    for(JButton b : buttons){
                        if(b.getActionCommand() == e.getActionCommand()){
                            b.setVisible(true);
                            break;
                        }
                    }
     
                    PanelHaut.remove(cbox);
                    //PanelHaut.validate();
                    PanelHaut.repaint();
                }
            }
        }
    }
     
    public class TestDeveloppez {
     
        public static void main(String[] args){
     
            try{
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            }catch(Exception ex){
                JOptionPane.showMessageDialog(null, "Erreur de chargement de theme");
            }
     
            TestPanelVisible fen = new TestPanelVisible();
            fen.setVisible(true);
        }
    }

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut
    Bonjour !

    C'est très gentil de te pencher encore sur mon problème (surtout à 2h du mat' )

    Je vais faire des tests en me basant sur ton code...

    Mais pourquoi utilises-tu dans un cas "validate" et dans l'autre "repaint" ? Quelle est la différence ?

    Merci encore

  9. #9
    Membre très actif
    Inscrit en
    Janvier 2004
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 208
    Par défaut
    la suite des tests me permet de comprendre la différence entre repaint() et validate() (d’après ma compréhension personnel des lectures et des test).
    Selon les lectures l'un va avec l'autre selon contexte d'affichage.

    De mon coté j'ai modifié le layout de panelhaut sur center, et lorsque l'on utilise repaint ou validate() pour le conteneur on comprend bien que validate recalcule bien le positionnement au sein du conteneur et que repaint() est juste la pour raffraichir l'affichage (repeindre lol).

    Maintenant l’idéal serait qu'un ténor de java apporte son point de vue.

    De ton coté dit moi ce que tu en pense ?

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut
    Je suis tombé là-dessus mais j'ai pas vraiment tout compris ... Perso, (j'ai honte) mais j'appelais ces fonctions un peu à l'arrach' et je regardais ce qui changeait. Mais je pense que tu dois avoir raison pour validate et repaint...

    Par contre, je viens de faire d'autres tests avec validate, repaint, updateUI, et le résultat est toujours le même... L'affichage des 3 boutons se fait sans problème, par contre, pour les 2 boutons, seul le bouton Annuler apparaît, et l'autre je dois passer la souris dessus... Mais quand je ne mets rien pour faire un "rafraichissement" c'est à dire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void passerModeEdition(boolean edition, JButton btnAjout, JButton btnSup, JButton btnEdit, JButton btnVal, JButton btnAnn) {
    	btnAjout.setVisible(!edition);
    	btnSup.setVisible(!edition);
    	btnEdit.setVisible(!edition);
    	btnVal.setVisible(edition);
    	btnAnn.setVisible(edition);
    }
    le comportement est aléatoire ... Je m'en suis rendu compte parce que ça me gavais, du coup, j'ai cliqué comme un malade sur le bouton Annuler (donc retour à l'affichage des 3 boutons) et Editer (retour à l'affichage des 2 boutons) et le comportement est TOTALEMENT ALEATOIRE !! des fois les boutons apparaissent et des fois, je dois passer la souris dessus...

  11. #11
    Membre très actif
    Inscrit en
    Janvier 2004
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 208
    Par défaut
    voici un autre test avec le minimum qui représente ton schéma de départ
    Qui est plus dans ta méthodologie

    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
     
    package util;
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    class MonPanel extends JPanel implements ActionListener{
     
        private JButton JBnew, JBdelete, JBupdate, JBview, JBundo;
     
        public MonPanel(){
     
            JBnew = new JButton("Ajouter");
            JBnew.setActionCommand("10");
            JBnew.addActionListener(this);
            JBnew.setVisible(false);
     
            add(JBnew);
     
            JBdelete = new JButton("Supprimer");
            JBdelete.setActionCommand("20");
            JBdelete.addActionListener(this);
            JBdelete.setVisible(false);
     
            add(JBdelete);
     
            JBupdate = new JButton("Modifier");
            JBupdate.addActionListener(this);
            JBupdate.setActionCommand("30");
            JBupdate.setVisible(false);
     
            add(JBupdate);
     
            JBview = new JButton("Edition");
            JBview.setActionCommand("100");
            JBview.addActionListener(this);
     
            JBundo = new JButton("Annuler");
            JBundo.setActionCommand("200");
            JBundo.addActionListener(this);
            JBundo.setVisible(false);
     
            add(JBview);
            add(JBundo);
     
        }
     
        @Override
        public void actionPerformed(ActionEvent e) {
     
            JButton btn = (JButton)e.getSource();
            int action = Integer.valueOf(e.getActionCommand());
     
            if(btn == JBview)
                this.PasserModeEditon(true);
     
            if(btn == JBundo)
                this.PasserModeEditon(false);
     
            switch (action){
                case 10:
                    System.out.println("Action ajouter");
                    break;
                case 20:
                    System.out.println("Action supprimer");
                    break;
                case 30:
                    System.out.println("Action modifier");
                    break;
                default:
                    System.out.println(e.getActionCommand());
            }
     
        }
     
        private void PasserModeEditon(Boolean edition){
     
            JBdelete.setVisible(edition);
            JBnew.setVisible(edition);
            JBupdate.setVisible(edition);
            JBundo.setVisible(edition);
     
            JBview.setVisible(!edition);
     
            this.validate();
            this.repaint();
        }
    }
     
    class MaFenetrePanel extends JFrame{
     
        private MonPanel pan;
     
        public MaFenetrePanel(){
     
            //Taille de l'ecran
            Toolkit tk = Toolkit.getDefaultToolkit();
            Dimension dim = tk.getScreenSize();
     
            setTitle("Test visible");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(dim.width / 2, dim.height /2);
            setLocationRelativeTo(null);
     
            pan = new MonPanel();
            pan.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
     
            getContentPane().add(pan);
        }
    }
     
    public class TestVisible {
     
        public static void main(String[] args){
            try{
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            }catch(Exception ex){
                JOptionPane.showMessageDialog(null, "Erreur de chargement de theme");
            }
     
            MaFenetrePanel fen = new MaFenetrePanel();
            fen.setVisible(true);
        }
    }
    a suivre...

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/10/2014, 10h22
  2. Problème d'affichage JTextField/JButton
    Par Nat_33 dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 16/10/2012, 19h12
  3. Problème d'affichage JTextField/JButton
    Par Nat_33 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 16/10/2012, 18h03
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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