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] repaint dans un rowHeaderView


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de biozaxx
    Profil pro
    Inscrit en
    Août 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 403
    Par défaut [JTable] repaint dans un rowHeaderView
    Bonjour,

    j'ai un probleme pour rafraichir des cellules (le rendu) dans une jtable:

    j'ai une jtable qui me sert de rowHeader pour une table principale.
    cette table se trouve donc dans le rowHeaderView de mon jscrollpane

    j'ai un MouseMotionListener qui me permet de changer la couleur des cellules de cette table sur laquelle je me balade.
    En gros je recupere la cellule au dessous de mon pointeur, je recupere le renderer, je modifie le background.

    Le probleme est que le repaint ne fonctionne que si j'appelle repaint() sur la table mais pas quand j'appelle repaint() sur le Jcomponent correspondant au renderer !
    Hors la table en question peut avoir énormement de cellules visbles, ce qui fait qu'il y a un petit temps de latence avant le changement de background.
    Si je parviens a faire le repaint uniquement sur la nouvelle cellule (et celle que le pointeur vient de quitter bien sur) le tout serait plus fluide.

    donc en gros comment faire pour que le repaint d'un jcomponent dans une cellule de table et le tou dans un rowheaderView fonctionne ?

    Je joins le code de la methode mouseMoved dans laquelle je fais tout ceci.
    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
     
    	public void mouseMoved(MouseEvent e) {
    		int column = table.columnAtPoint(e.getPoint());
    		int row = table.rowAtPoint(e.getPoint());
    		currentValue = table.getValueAt(row, column);
     
    		if (row > -1 && column > -1){
     
    			if (currentValue!=oldValue){
     
    				if (oldValue!=null)
    					((TableCellRenderer)table.getCellRenderer(oldRow, oldCol)).getTableCellRendererComponent(table, oldValue, false, false, oldRow , oldCol).setBackground(mouseOut);
     
    			JComponent comp = (JComponent)((TableCellRenderer)table.getCellRenderer(row, column)).getTableCellRendererComponent(table, currentValue, false, false, row , column);
    			comp.setBackground(mouseOn);
    			oldValue = currentValue;
    			oldRow = row;
    			oldCol = column;
    			table.repaint();  
    			/*
    			 * je prefereai ici faire comp.repaint() qui prendrai moins de temps
    			 */
    			}
    		}  else {
    			oldValue = null;
    		}
    	}
    merci pour votre aide

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    En fait, la JTable n'utilise qu'une seule instance de Renderer pour plusieurs cellules. Donc appeler repaint sur le renderer ne marchere pas, à mon avis.

    As-tu essayé d'appeler table.repaint(x, y, width, height) , où le rectangle contient les 2 cellules en question ? Je crois que ça devrait marcher.

    Concernant le background, je ne suis pas sûr que la méthode que tu utilises fonctionne. A mon avis, le background sera modifié lors du prochain appel à getTableCellRendererComponent, mais je peux me tromper.

    Je pense que le plus efficace serait de stocker l'information de la case survolée dans la JTable, et d'y accéder dans la méthode getTableCellRendererComponent. En crade et rapide ça donne ça :
    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
    public class MaTable extends JTable {
      int rolloverRow;
      int rolloverCol;
     
      ...
    }
     
    ... // renderer
    public void getTableCellRendererComponent(JTable table, ..., int row, int col) {
      ...
      if(table instanceof MaTable) {
        MaTable mt = (MaTable) table;
        if(row == mt.rolloverRow && col == table.rolloverCol) {
          rendererComponent.setBackground(...);
        }
      }
      ...
    }
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Sinon le plus simple selon moi est d'envoyer un évènement via ton tablemodel signifiant le changement d'une cellule (voir du côté des TableModelEvent)

  4. #4
    Membre éclairé Avatar de biozaxx
    Profil pro
    Inscrit en
    Août 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 403
    Par défaut
    >Claythest:
    pour le TableModelEvent je ne pense pas que cela fonctionne :
    les TableModelListener ne detectent qu'un changement de contenu or je ne change pas les données je cherche juste a détécter lorsque je change de cellule.

    >xavlours:
    la difficulté que j'avais était de recuperer les coordonnées du rectangle correspondant a ma cellule. C'est chose faite, donc le table.repaint(monRectangle) fonctionne à merveille


    merci

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

Discussions similaires

  1. [JTable] JRadioButton dans les cellules
    Par Takis dans le forum Composants
    Réponses: 4
    Dernier message: 14/04/2008, 13h54
  2. Problème au niveau du repaint() dans l'applet
    Par sofuzion dans le forum Applets
    Réponses: 1
    Dernier message: 23/11/2007, 18h11
  3. jtable, combobox dans une cellule
    Par fraco dans le forum Composants
    Réponses: 8
    Dernier message: 27/10/2007, 11h20
  4. JTable comme dans Excel
    Par rozwel dans le forum Composants
    Réponses: 4
    Dernier message: 13/08/2007, 15h25
  5. Jtable + ToolTip dans les cellules
    Par tuxor dans le forum Composants
    Réponses: 6
    Dernier message: 20/11/2005, 12h09

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