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 :

[jTable] probleme de rafraichissement (conception?)


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut [jTable] probleme de rafraichissement (conception?)
    bonjour,
    j'ai parcouru pas mal de post concernant les jtables, et je n'arrive pas à trouver ce que je dois faire pour mettre a jour mon affichage.
    dans une jframe j'inclus un JScrollPane qui contient ma Jtable. A l'aide d'une jComboBox je fais differentes requetes à une BDD poiur remplir ma jtable (qui ne varie que sur le nombre de tuples). le probleme est que lorsque je change la table, il n'y a pas de refresh. j'ai essayé le repaint() à differents endroits de mon programme mais rien n'y fait.
    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
     
    public void actionPerformed(ActionEvent e)
        {
            if(e.getSource()==jComboBox1){
                bou = (String)jComboBox1.getSelectedItem();
     
            String theta = noyau.bddChantierEnCourEmployes.chopeFonction(bou);
            int chalou = noyau.bddChantierEnCourEmployes.chopeLongueurColSansFiniArchive(bou, theta);
            String paf = "";
            paf = paf.valueOf(chalou+" chantiers en cours");
            jLabel1.setText(paf);
            Object chelou[][]= noyau.bddChantierEnCourEmployes.chopeListeChantier(chalou,bou,theta);
            String[] titreColonnes = { "Numero du chantier", "Nom du chantier", "Client","Calculateur", "Dessinateur"};
            JTable jTable2 = new JTable(chelou, titreColonnes);
            this.jTable2 = jTable2;
            JScrollPane jScrollPane12 = new JScrollPane();
            jTable2.setModel(new MyTableModel(chelou, titreColonnes));
            jTable2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
               TableColumn col;
            col = jTable2.getColumnModel().getColumn(0);
            col.setPreferredWidth(60);
            col = jTable2.getColumnModel().getColumn(1);
            col.setPreferredWidth(350);
            col = jTable2.getColumnModel().getColumn(2);
            col.setPreferredWidth(110);
            getContentPane().add(jScrollPane12,new org.netbeans.lib.awtextra.AbsoluteConstraints(50, 20, 700, 500));
            jScrollPane12.setOpaque(true);
            jTable2.setOpaque(true);
            jScrollPane12.setViewportView(jTable2);
            this.jScrollPane2= jScrollPane12;
            this.jTable2 = jTable2;
            int chaton = noyau.bddChantierEnCourEmployes.chopeLongueurColWhere(theta);
            String[] chat = noyau.bddChantierEnCourEmployes.chopeCouleulr(chaton, bou,theta);
            for(int h = 0; h<chalou; h++){
                for(int pouf = 0; pouf <chaton; pouf ++)
                {
                    if(((String)jTable2.getValueAt(h,0)).compareTo(chat[pouf]) == 0){
                    this.monarraylist.add(new Integer(h));    
                    }
                }
            }
            jTable2.setDefaultRenderer(String.class, new ColorRenderer());
            jTable2.repaint();
            this.jScrollPane2.repaint();
            repaint();
    }
    ps : j'ai quand même un doute sur la création de la table directement dans l'ActionListener, mais ca ne devrait pas changer beaucoup si?

  2. #2
    Membre éclairé Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Par défaut
    Bonjour,
    as tu essayer validate()?
    Ton tableau est-il bien re-rempli, même si il ne s'affiche pas?

  3. #3
    Membre confirmé Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    je viens d'essayer validate(), mais ca ne change rien.
    en fait la premiere fois que je choisis un tableau dans ma combobox celui ci s'affiche bien, c'est lors du changement que l'affichage ne se fait plus, c'est l'ancien tableau qui reste affiché. et oui mes données changent bien

  4. #4
    Membre éclairé Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Par défaut
    Essaie sinon de remove ton tableau et de le réafficher(add), c'est un peu barbare mais bon...

    Sinon le mieux serait de faire un model et de ne pas oublier de faire un fireTableCellUpdated.

  5. #5
    Membre confirmé Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    j'ai déjà un model en fait :
    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
     
    class ColorRenderer extends DefaultTableCellRenderer {
             public ColorRenderer() {
                 jTable2.repaint();
     
            repaint();
                }
             public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column) {
                  if (monarraylist.contains(new Integer(row))){
                                      setBackground(Color.RED);
                         }
                  else {
                        setBackground(Color.WHITE);
                       }
              super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
              return this;
             }
        }
    et pour le tableau :
    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
     
    class MyTableModel extends AbstractTableModel {
             String[] columnNames ;
             Object[][] data ;
     
            public MyTableModel(Object[][] data, String[] columnNames ){
                this.data = data;
                this.columnNames = columnNames ;
                fireTableStructureChanged();
            }
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
     
            /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell.  If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than a check box.
             */
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
     
            /*
             * Don't need to implement this method unless your table's
             * editable.
             */
            public boolean isCellEditable(int row, int col) {
                //Note that the data/cell address is constant,
                //no matter where the cell appears onscreen.
                if (col < 5) {
                    return false;
                } else {
                    return true;
                }
            }
     
            /*
             * Don't need to implement this method unless your table's
             * data can change.
             */
            public void setValueAt(Object value, int row, int col) {
                if (DEBUG) {
                    System.out.println("Setting value at " + row + "," + col
                                       + " to " + value
                                       + " (an instance of "
                                       + value.getClass() + ")");
                }
     
                data[row][col] = value;
                fireTableCellUpdated(row, col);
                fireTableStructureChanged();
                if (DEBUG) {
                    System.out.println("New value of data:");
                    printDebugData();
                }
            }
            public void setData(Object[][] data) {
                this.data = data;
                fireTableDataChanged();
        }
            private void printDebugData() {
                int numRows = getRowCount();
                int numCols = getColumnCount();
                for (int i=0; i < numRows; i++) {
                    System.out.print("    row " + i + ":");
                    for (int j=0; j < numCols; j++) {
                        System.out.print("  " + data[i][j]);
                    }
                    System.out.println();
                }
                System.out.println("--------------------------");
            }
        }

  6. #6
    Membre éclairé Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Par défaut
    Je suis désolé mais je vois pas alors car je pense que ton model de table est Ok
    Si tu veux j'ai une solution mais vraiment moche

    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
     
     
    public void actionPerformed(ActionEvent evenement){
     
     
     
    		getContentPane().remove(tonJScrollPane_ou_JTable);
     
    		//tu recreer un modele
     
    		ModelTable mod = new ModelTable(...);
    		TonJTable = new JTable(mod);
     
     
     
    		sc1=new JScrollPane(TonJTable);
     
                    getContentPane().add(tonJScrollPane_ou_JTable);
     
     
     
    		for(int i=0;i<nb_ligne;i++){
    		        //tu remplis ton JTable
    			TonJTable.setValueAt(...);
     
     
     
    			}
     
     
     
     
     
     
    		}
     
    });
    Voilà ca marche mais c'est pas beau je te l'avais dit

  7. #7
    Membre éclairé Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Par défaut
    J'ai retrouvé le code, j'essaie de le simplifier un peu car la classe fait plus de 2000 lignes...
    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
     
     
    box.addActionListener(new ActionListener(){
     
    	public void actionPerformed(ActionEvent evenement){
     
    		//ici je selectionne "Nom" dans la Combobox
    		if(String.valueOf(box.getSelectedItem()).equalsIgnoreCase("Nom")==true){
     
     
    			//je vire le JScrollPane et donc le tableau(car je l'avais afficher dés le départ)
    			getContentPane().remove(sc1);
     
    			//ici ca me renvoie juste le nombre de ligne à afficher	
    			nb = nom.Retourne_Nb_lig();
     
    			//nouveau tableau de String avec le nombre de ligne
    			tab = new String[nb][6];
     
         			//Dans tab je met le resultat de ma requête
    			tab = nom.Retourne_TabA(tab);
     
    			//Je creer un nouveau modele avec mon nouveau tableau		
    			ModelTable3 mod = new ModelTable3(nb,true);
    			tab1 = new JTable(mod);
     
    			//je met le tableau dans le JScrollPAne			
    			sc1=new JScrollPane(tab1);
    			getContentPane().add(sc1);
     
     
    			//je rempli mon JTable	
    			for(int i=0;i<nb;i++){
     
    				tab1.setValueAt(tab[i][0],i,0);
    				tab1.setValueAt(tab[i][1],i,1);
    				tab1.setValueAt(tab[i][2],i,2);
    				tab1.setValueAt(tab[i][3],i,3);
    				tab1.setValueAt(tab[i][4],i,4);
    				tab1.setValueAt(tab[i][5],i,5);
     
    						}
     
     
    			}
     
     
     
    	}
     
    });
    Voilà c'était çà mais bon çà date donc c'est vraiment pas super comme technique...

  8. #8
    Membre confirmé Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    ok je vais tester ca (p-e demain).

    mais moi ds mon prog je remplis la jtable en meme temps que je la crée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    JTable jTable2 = new JTable(chelou, titreColonnes);
    je verrai bien si ca a une importance.

    merci pr le code

  9. #9
    Invité
    Invité(e)
    Par défaut
    this.monarraylist.add(new Integer(h));
    c'est ça ta méthode pour remplir ta JTable ?
    D'où viens monarraylist ?
    Es-tu sûr que avec ça le modèle de la JTable est modifié ?
    Peux-être as-tu fais un binding de monarraylist avec le model de ta table ?

    tab1.setValueAt(tab[i][0],i,0);
    Cela parais dèja plus commun.

  10. #10
    Membre confirmé Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Par défaut
    non monarraylist est un petit code a part pour colorier en rouge certaines lignes de mon tableau.Et ne change en aucun cas le contenu du tableau, ce code marche est n'est pas le probleme (enfin je ne verrasi pas pourquoi).

    mon tableau vient de se code la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Object chelou[][]= noyau.bddChantierEnCourEmployes.chopeListeChantier(chalou,bou,theta);
            String[] titreColonnes = { "Numero du chantier", "Nom du chantier", "Client","Calculateur", "Dessinateur"};
            JTable jTable2 = new JTable(chelou, titreColonnes);
    a chaque fois que je selectionne quelqu'un d'autres dans ma combobox il y a une nouvelle requete qui s'effectue -> changemetn du tableau.

  11. #11
    Invité
    Invité(e)
    Par défaut
    dans le code de ton premier post, il y a plusieurs chose qui me gène

    JTable jTable2 = new JTable(chelou, titreColonnes);
    this.jTable2 = jTable2;
    JScrollPane jScrollPane12 = new JScrollPane();
    jTable2.setModel(new MyTableModel(chelou, titreColonnes));
    à quoi ca sert d'utiliser une variable jTable2 alors que ton objet contient cet attribut ? Tu initialise 2 fois le model de ta JTable ?

    il y a une nouvelle requete qui s'effectue -> changemetn du tableau
    c'est à dire, c'est le actionPerformed de ton premier post ?

  12. #12
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    D'une part, moi j'utilise toujours une ArrayList dans le Model plutôt qu'un tableau : beaucoup plus simple pour l'ajout ou la suppression de ligne. Bon ok, tu n'as pas l'air de vouloir ajouter des lignes, mais bon, moi je fais comme ça...

    Sinon, ton model a l'air correct.

    Pour ce qui est de l'ActionListener, je créerai effectivement ma table à l'extérieur, je lui affecterai le modèle, et dans l'ActionListener, je ne ferai que faire un setData() dans lequel je passerai le résultat de ma requête.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/05/2010, 10h17
  2. [JTable] Probleme de rafraichissement
    Par Renaud-62 dans le forum Composants
    Réponses: 2
    Dernier message: 24/06/2008, 15h39
  3. Réponses: 4
    Dernier message: 24/08/2007, 16h44
  4. Réponses: 8
    Dernier message: 24/05/2007, 18h09
  5. [JTable] probleme de rafraichissement
    Par biozaxx dans le forum Composants
    Réponses: 6
    Dernier message: 13/02/2006, 14h14

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