Rafraichissement d'une table

Résolu
Messages postés
80
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
12 janvier 2007
-
Messages postés
80
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
12 janvier 2007
-
Bonjour,

J'ai quelques soucis lors du rafraichissement d'une table.
Pour commencer, je pose le décor.

Je crée une table personnelle qui comporte des Header de colonnes et de lignes.
Je met cette table dans un scrollpane, et je met le tout dans une fenêtre.
Il m'est alors possible de redéfinir la taille de la table par l'intermédiaire de deux JTextField et d'un bouton de validation.

Voilà à quoi ressemble la fenêtre à son ouverture:

Lorsque je définis une taille pour ma table qui fait qu'elle soit plus grande que la fenêtre, tout se passe bien:

Mais lorsque je commence à vouloir faire glisser la vue, tout se corse:

Je n'arrive pas bien à savoir à quoi cela peut être dû.
Je préciserais que si la table initiale est directement trop grande pour la fenêtre, il n'est pas nécessaire de faire un redimensionnement de cette dernière pour que cela se produise...

Pour redimensionner ma table, je me contente de remplacer le Model courant par un nouveau avec la nouvelle taille.

Si vous avez une idée, n'hésiter pas... Je passerais les morceaux de sources qui pourront venir en aide à votre réflexion.

Merci de votre aide.

3 réponses

Messages postés
80
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
12 janvier 2007

Bonjour.

Il semblerait que c'est effectivement le redessin qui ne fonctionne pas très bien.
Pour palier à ce problème... J'ai tout simplement changé mon fonctionnement.

Plus nécessaire de redessiner les cellules.

En effet, j'ai créé un MGScrollTable.java dans lequel je crée un JScrollPane auquel j'attache ma table, et je lui définit un RowHeader avec le MGHeaderRenderer et ca marche très bien.

Merci tout de même de votre participation.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Mais qu'est-ce que vous avez tous avec les JTable en ce moment, c'est dingue cà quand même ! ;)

Sinon, oui en effet, sans code on va pas pouvoir faire grand chose pour toi !
Messages postés
80
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
12 janvier 2007

En fait, je ne vais pas vous asser tout mon code, ce serait fastidieux (il est relativement conséquent tout de même).
Par contre si vous me dites quelle composante peut bien créer ce problème, je pourrais vous donenr le code correspondant.

J'ajouterais juste que le problème ne se pose pas sur un déplacement vertical de ma fenêtre...

Pour être un peu plus complet tout de même, voici les fichiers que j'utilise:
MGTable.java
MGTableModel.java
MGRowHeader.java
MGRowHeaderUI.java
MGRowHeaderRenderer.java
MGColoredTableCellRenderer.java

Le fichier qui attire ma curiosités est:
MGRowHeaderUI.java  où je redéfinit paint().

la voici :





public





void



paint(Graphics g, JComponent c)




{

             Rectangle clipBounds = g.getClipBounds();













if



(header.getColumnModel() == null

)







return



;















int



column = 0;






boolean



drawn = false

;






int



draggedColumnIndex = -1;




Rectangle draggedCellRect = null

;




Dimension size = header.getSize();




Rectangle cellRect = new

Rectangle(0, 0, size.width, size.height);










Enumeration enumeration = header.getColumnModel().getColumns();












while



(enumeration.hasMoreElements())




{





TableColumn aColumn = (TableColumn)enumeration.nextElement();






int



columnMargin = header.getColumnModel().getColumnMargin();




cellRect.height = aColumn.getWidth() + columnMargin;





// Note: The header cellRect includes columnMargin so the






// drawing of header cells will not have any gaps.













if



(cellRect.intersects(clipBounds))




{





drawn = true

;






if



(aColumn ! = header.getDraggedColumn())




{





paintCell(g, cellRect, column);





}






else






{






// Draw a gray well in place of the moving column





g.setColor(header.getParent().getBackground());




g.fillRect(cellRect.x, cellRect.y,




cellRect.width, cellRect.height);




draggedCellRect = new

Rectangle(cellRect);




draggedColumnIndex = column;





}





}






else






{







if



(drawn)





// Don't need to iterate through the rest







break



;





}










cellRect.y += cellRect.height;




column++;





}













// draw the dragged cell if we are dragging





TableColumn draggedColumnObject = header.getDraggedColumn();






if



(draggedColumnObject != null

&& draggedCellRect ! = null

)




{





draggedCellRect.x += header.getDraggedDistance();




paintCell(g, draggedCellRect, draggedColumnIndex);





}





}












private





void



paintCell(Graphics g, Rectangle cellRect, int

columnIndex)




{





TableColumn aColumn = header.getColumnModel().getColumn(columnIndex);




TableCellRenderer renderer = aColumn.getHeaderRenderer();






if



( renderer == null

)




{





aColumn.setHeaderRenderer(new

MGRowHeaderRenderer());




renderer = aColumn.getHeaderRenderer();





}




Component component = renderer.getTableCellRendererComponent(









header.getTable(), aColumn.getHeaderValue(),






false



, false

, -1, columnIndex);









rendererPane.add(component);





rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y,




cellRect.width, cellRect.height, true

);





}

Mais comme j'ai dit précedemment, je ne sais pas si c'est ici que se trouve le problème...

Merci de m'aider.