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 :

Refresh d'une Jtable


Sujet :

Composants Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Points : 102
    Points
    102
    Par défaut Refresh d'une Jtable
    Bonjour à tous.

    Je tente de rafraichir une JTable apres avoir mis des donnees dedans. J'ai une methode refresh() qui recupere les donnees a afficher depuis une Arraylist.

    Au lancement tout va bien, j'ai ce quíl faut dans la JTable.
    Nom : image1.png
Affichages : 1874
Taille : 9,0 Ko

    Lorsque je clique sur Add, ma JTable disparait...pas normal
    Nom : image2.png
Affichages : 1869
Taille : 4,5 Ko

    Et lorsque je refresh, rien ne se passe. Il faut que je tente de redimensionner la fenetre a la main pour que ceci apparaisse.
    Nom : image3.png
Affichages : 1857
Taille : 10,7 Ko

    Voila le code de ma classe
    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
    package graphic_interface;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
     
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.event.TableModelEvent;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellRenderer;
     
    import character.ListPerso;
     
     
     
    @SuppressWarnings("serial")
    public class Fenetre_principale extends JFrame {
     
    	DefaultTableModel tableur = new DefaultTableModel();;
    	JTable table = new JTable();
    	ListPerso listePerso = new ListPerso();
    	JPanel jpp;
     
    	public Fenetre_principale(){
    		createListe();
    		JFrame main_windows = new JFrame();
    		main_windows.setBounds(400, 200, 800, 600);
    		main_windows.setTitle("Legend of the five rings initiative calculator");
    		main_windows.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		jpp = new JPanel();
    		main_windows.add(jpp);
    		final JTextField nomField = new JTextField("Nom");
    		nomField.setPreferredSize(new Dimension(150,30));
    		jpp.add(nomField);
    		final JTextField initField = new JTextField("Initiative");
    		initField.setPreferredSize(new Dimension(150,30));
    		jpp.add(initField);
    		final JTextField vieField = new JTextField("Points de Vie");
    		vieField.setPreferredSize(new Dimension(150,30));
    		jpp.add(vieField);
    		final JTextField malusField = new JTextField("Malus");
    		malusField.setPreferredSize(new Dimension(150,30));
    		jpp.add(malusField);
     
    		JButton addPersoButton = new JButton();
    		addPersoButton.setText("Add");
    		addPersoButton.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				{
     
    					ArrayList<Object> perso = new ArrayList<>();
    					String name = new String(nomField.getText());
    					String initiative = new String(initField.getText());
    					String pointDeVie = new String(vieField.getText());
    					String malus = new String(malusField.getText());
    					perso.add(name);
    					perso.add(initiative);
    					perso.add(pointDeVie);
    					perso.add(malus);
    					listePerso.addList(perso);
    					System.out.println("Bouton Add");
    					//print();
    				}
     
    			}
    		});
    		jpp.add(addPersoButton);
     
    		JButton refreshButton = new JButton();
    		refreshButton.setText("Refresh");
    		refreshButton.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				{
    					System.out.println("Bouton refresh");
    					refreshTable();
     
    				}
     
    			}
    		});
    		jpp.add(refreshButton);
     
    		refreshTable();
     
    		main_windows.setVisible(true);
    	}
     
    	public void print(){
    		for(int i=0;i<listePerso.getListPersoArray().size();i++){
    			for(int j=0;j<listePerso.getListPersoArray().get(i).size();j++){
    				System.out.print(listePerso.getListPersoArray().get(i).get(j)+" ");
    			}
    		}
    	}
     
     
    	public void refreshTable(){
    		//tableur = new DefaultTableModel();
    		tableur.addColumn("Nom");
    		tableur.addColumn("Initiative");
    		tableur.addColumn("Hp");
    		tableur.addColumn("Malus");
    		tableur.setRowCount(0);
     
    		for(int i=0;i<listePerso.getListPersoArray().size();i++){
    			tableur.addRow(new Object[] {listePerso.getListPersoArray().get(i).get(0),
    					listePerso.getListPersoArray().get(i).get(1),
    					listePerso.getListPersoArray().get(i).get(2),
    					listePerso.getListPersoArray().get(i).get(3)
    			});
    		}
    		table.setModel(tableur);
    		table.setPreferredScrollableViewportSize(new Dimension(600, 100));
    		JScrollPane avecAsc = new JScrollPane(table); 
    		tableur.fireTableDataChanged();
    		table.repaint();
    		jpp.add(avecAsc);
     
    	}
     
    }
    Je voudrais juste que ma JTable se rafraîchisse avec les nouvelles données intégrés dans mon ArrayList.

    Je ne maîtrise pas encore beaucoup le cote graphique de Java.
    Une idée ?
    Merci à vous.

  2. #2
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Bonjour,

    Pour le "refresh", la méthode "DefaultTableModel.fireTableDataChanged()" convient. Par contre, elle est à appliquer à DefaultTableModel du JTable.
    Dans le code fourni, la méthode est appliquée sur une instance sans relaition avec le JTable.

    Au choix, à faire une fois à l'initialisation :
    • Récupérer l'instance DefaultTableModel du JTable : DefaultTableModel tableur = (DefaultTableModel) table.getModel();
    • Lier la nouvelle instance à ton JTable : table.setModel(tableur);


    N'ayant pas le code de la classe "ListPerso", je n'ai pas pu tester les 2 solutions. Il y aura sûrement un peu de code à adapter.

    Pour le "add", je me dis qu'il manque un "refresh" pour afficher les nouveaux éléments ajoutés. Par contre, je n'expliqe pas pourquoi le JTable se vide...

    Benoit

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Points : 102
    Points
    102
    Par défaut
    Merci de ton aide.
    J'ai réussi hier soir tard à faire fonctionner le tout, je ne sais par quel miracle.

    Mais au vu de ce que tu me dis, je n'ai pas correctement lié ma table et mon tableur. J'avoue que je comprend pas toutes les relations entre tous ces objets, mais je vais tester ce que tu me proposes en rentrant ce soir. Je n'aime pas bien ne pas comprendre.
    En tous cas, le coté graphique est laborieux en Java...

    Merci de ton aide. Je teste ce soir

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Perso je te conseillerais d'oublier le DefaultTableModel.
    Ca peut suffire pour un truc vite fait, mais lorsqu'on veut manipuler des données plus convenablement cela devient vite la galère avec ces tableaux de tableaux...


    A la place je commencerais par créer une classe"Perso" représentant les données d'une ligne, avec les getters (et eventuellement les setters).
    Ensuite je me créerais mon propre modèle en héritant d'AbstractTableModel.

    C'est simple il suffit de définir 3 méthodes pour un fonctionnement de base :
    • getColumnCount() qui indique le nombre de colonne.
    • getRowCount() qui indique le nombre de ligne.
    • getValueAt() qui retourne la valeur d'une cellule en particulier.


    Et tu peux également redéfinir getColumnName() pour définir le nom des colonnes (par défaut tu as A, B, C, ...).

    Il ne reste plus qu'à coupler cela avec une List<Perso> contenant les données, ce qui donnerait quelque chose comme cela :
    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
    class MyTableModel extends AbstractTableModel {
     
    	private final List<Perso> values = new ArrayList<Perso>();
     
    	@Override
    	public int getColumnCount() {
    		return 4; // en dur
    	}
     
    	@Override
    	public int getRowCount() {
    		return values.size();
    	}
     
    	@Override
    	public Object getValueAt(int rowIndex, int columnIndex) {
    		Perso perso = values.get(rowIndex);
    		switch(columnIndex) {
    		case 0: return perso.getName();
    		case 1: return perso.getInitiative();
    		case 2: return perso.getHP();
    		case 3: return perso.getMalus();
    		}
    		throw new IllegalStateException();
    	}
     
    	@Override
    	public String getColumnName(int columnIndex) {
    		switch(columnIndex) {
    		case 0: return "Nom";
    		case 1: return "Initiative";
    		case 2: return "HP";
    		case 3: return "Malus";
    		}
    		throw new IllegalStateException();
    	}
     
    ...
    Il ne reste plus qu'à rajouter des méthodes permettant de modifier le contenu du modèle, par exemple pour rajouter un élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public void add(Perso perso) {
    		this.values.add(perso);
    		int row = this.values.size()-1;
    		fireTableRowsInserted(row, row);
    	}
    Il faut surtout bien appeler la méthode fireXXX() correspondante et avec les bons paramètres afin que la table soit bien mise à jour correctement.


    a++

Discussions similaires

  1. focus dans une cellule d'une JTable
    Par coil dans le forum Composants
    Réponses: 5
    Dernier message: 07/07/2010, 17h15
  2. Auto refresh d'une JTable sur Jinternal JDK1.5
    Par murgen23 dans le forum EDT/SwingWorker
    Réponses: 2
    Dernier message: 08/09/2008, 11h20
  3. refresh d'une jtable a l'interieur d'un panel
    Par thomas1509 dans le forum Composants
    Réponses: 2
    Dernier message: 17/01/2008, 13h29
  4. programmer le bouton refresh sur une jtable
    Par henpower dans le forum Composants
    Réponses: 5
    Dernier message: 07/09/2007, 14h37
  5. Problème de refresh dans une JTable
    Par vano dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2006, 14h57

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